标题: [文件操作] 批处理句柄定向为何提示文件占用无法打开? [打印本页]
作者: zhouyongjun 时间: 2010-1-26 17:22 标题: 批处理句柄定向为何提示文件占用无法打开?
很长时间没逛论坛,也很没写P,都感觉知识有点生疏了。刚才写东西遇到个小小的问题,故发帖求助各位:
代码如下,运行提示“文件被占用,无法打开”。???,谢!-
- @echo off
- echo;>nul 3>abc.txt
- echo abc
- echo;>nul 4>con
- start "" "abc.txt"
- pause
复制代码
作者: Batcher 时间: 2010-1-26 17:36
这是个已知的问题了吧,换种方案如何?
参考:提高批处理代码效率的常用技巧及方案
http://www.bathome.net/thread-4831-1-1.html
作者: zhouyongjun 时间: 2010-1-26 18:17
换方法是可以,但是我想知道原因
作者: Batcher 时间: 2010-1-26 21:26
- @echo off
- echo;>nul 3>abc.txt
- echo abc
- echo;>nul 4>con
- start notepad.exe abc.txt
复制代码
作者: zhouyongjun 时间: 2010-1-26 22:00 标题: 回复 4楼 的帖子
这样测试可以。。。
感觉有点诡异
作者: wxcute 时间: 2010-1-26 22:02
“另一个程序正在使用此文件,进程无法访问。”
这句话的表面理解:
一个程序正在使用A.TXT文件,不能用另一个程序打开它。
实际理解为:
本CMD正在使用(编辑)ABC.TXT程序呢,ABC.TXT(程序)进程你就别运行了。
Q:为什么这里ABC.TXT会被当为程序呢?
A:请参看START /?。
Q:当发现ABC.TXT不是程序时会怎么样呢?
A:这时会根据其扩展名用默认程序打开(.TXT一般默认是用记事本)。
作者: zhouyongjun 时间: 2010-1-26 22:27 标题: 回复 6楼 的帖子
我之前没加echo;>nul 4>con这句,还好理解。后面我想到了,就加了这句。就好比告诉了批处理,后面句子返回的信息不用再定向到ABC.TXT中去了。那怎么还会是“编辑”状态呢?
作者: applba 时间: 2011-5-19 15:06
句柄备份好复杂
作者: CrLf 时间: 2011-5-19 23:00
3>1.txt 4>1.txt echo 每个文件一个时间点对应的写入句柄唯一
作者: qzwqzw 时间: 2011-5-19 23:43
7# zhouyongjun
echo;>nul 4>con之后
abc.txt文件本身并没有被关闭
因为abc.txt的所在的句柄1是被con“非法抢占”的
所以此时访问abc.txt仍然是共享冲突
这与正常执行重定向的语句不同
在语句执行结束后cmd会关闭文件
作者: applba 时间: 2011-5-20 01:12
本帖最后由 applba 于 2011-5-20 03:42 编辑
不是没被关闭,而是仍在使用中。
echo;>nul 3>abc.txt
执行完毕后,句柄的指向情况是 1>abc.txt 2>con 3>con
echo;>nul 4>con
执行完毕后,句柄的情况是 1>abc.txt 2>con 3>con 4>con
start "" "abc.txt"
这时abc.txt被句柄1占用,而且是以只写属性打开的。
作者: qzwqzw 时间: 2011-5-20 07:57
11# applba
对句柄的操作结果你的认识还存在误区
下面的链接提供一个句柄模拟代码
http://www.bathome.net/viewthrea ... omuid=3023#pid31415
你可以实际测试进行验证
另外关于句柄备份中打开的文件句柄
直到当前打开的cmd关闭后才会被关闭
参见下面的链接
http://www.bathome.net/thread-7825-1-1.html
作者: lvsehuaxue 时间: 2011-6-15 20:22
本帖最后由 lvsehuaxue 于 2011-6-15 20:24 编辑
不是没被关闭,而是仍在使用中。
echo;>nul 3>abc.txt
执行完毕后,句柄的指向情况是 1>abc.txt 2>con 3>con
echo;>nul 4>con
执行完毕后,句柄的情况是 1>abc.txt 2>con 3>con 4>con
start "" "abc.txt"
这时 ...
applba 发表于 2011-5-20 01:12
最后的结果应该是 1>con 2>con 3 >con 4>abc.txt,abc.txt仍然被句柄4占用,因此,其他程序无法访问abc.txt。
作者: applba 时间: 2011-8-5 17:57
回复 12# qzwqzw
由于修改了句柄方向的备份,导致句柄方向恢复的时候,默认的句柄方向指向了 1.txt。因此,1.txt会被句柄一直占用。
如果最初1.txt是以只读或只写属性打开的,那么这个这个1.txt被映射到句柄后,以后具有只读或只写属性。
这就是读写重读产生的原因。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |