[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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

这是个已知的问题了吧,换种方案如何?

参考:提高批处理代码效率的常用技巧及方案
http://www.bathome.net/thread-4831-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

换方法是可以,但是我想知道原因

TOP

  1. @echo off
  2. echo;>nul 3>abc.txt
  3. echo abc
  4. echo;>nul 4>con
  5. start notepad.exe abc.txt
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 4楼 的帖子

这样测试可以。。。
感觉有点诡异

TOP

另一个程序正在使用此文件,进程无法访问。

这句话的表面理解:
一个程序正在使用A.TXT文件,不能用另一个程序打开它。

实际理解为:
本CMD正在使用(编辑)ABC.TXT程序呢,ABC.TXT(程序)进程你就别运行了。

Q:为什么这里ABC.TXT会被当为程序呢?
A:请参看START /?。
Q:当发现ABC.TXT不是程序时会怎么样呢?
A:这时会根据其扩展名用默认程序打开(.TXT一般默认是用记事本)。
批处理之家论坛官方 QQ 群 :【当前人数/人数上限】【2009-07-08】
群①:43011867(181/200);群②:(暂缺数据);群③:66165582(120/200)。

TOP

回复 6楼 的帖子

我之前没加echo;>nul 4>con这句,还好理解。后面我想到了,就加了这句。就好比告诉了批处理,后面句子返回的信息不用再定向到ABC.TXT中去了。那怎么还会是“编辑”状态呢?

TOP

句柄备份好复杂

TOP

3>1.txt 4>1.txt echo 每个文件一个时间点对应的写入句柄唯一

TOP

7# zhouyongjun
echo;>nul 4>con之后
abc.txt文件本身并没有被关闭
因为abc.txt的所在的句柄1是被con“非法抢占”的
所以此时访问abc.txt仍然是共享冲突

这与正常执行重定向的语句不同
在语句执行结束后cmd会关闭文件
天的白色影子

TOP

本帖最后由 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占用,而且是以只写属性打开的。

TOP

11# applba

对句柄的操作结果你的认识还存在误区
下面的链接提供一个句柄模拟代码
http://www.bathome.net/viewthrea ... omuid=3023#pid31415
你可以实际测试进行验证

另外关于句柄备份中打开的文件句柄
直到当前打开的cmd关闭后才会被关闭
参见下面的链接
http://www.bathome.net/thread-7825-1-1.html
天的白色影子

TOP

本帖最后由 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。
1

评分人数

    • qzwqzw: 多些纠正我的我的错误!技术 + 1

TOP

回复 12# qzwqzw

由于修改了句柄方向的备份,导致句柄方向恢复的时候,默认的句柄方向指向了 1.txt。因此,1.txt会被句柄一直占用。
如果最初1.txt是以只读或只写属性打开的,那么这个这个1.txt被映射到句柄后,以后具有只读或只写属性。
这就是读写重读产生的原因。

TOP

返回列表