Board logo

标题: [文件操作] 批处理句柄定向为何提示文件占用无法打开? [打印本页]

作者: zhouyongjun    时间: 2010-1-26 17:22     标题: 批处理句柄定向为何提示文件占用无法打开?

很长时间没逛论坛,也很没写P,都感觉知识有点生疏了。刚才写东西遇到个小小的问题,故发帖求助各位:
代码如下,运行提示“文件被占用,无法打开”。???,谢!
  1. @echo off
  2. echo;>nul 3>abc.txt
  3. echo abc
  4. echo;>nul 4>con
  5. start "" "abc.txt"
  6. 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

  1. @echo off
  2. echo;>nul 3>abc.txt
  3. echo abc
  4. echo;>nul 4>con
  5. 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