找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 41406|回复: 13

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

[复制链接]
发表于 2010-1-26 17:22:28 | 显示全部楼层 |阅读模式
很长时间没逛论坛,也很没写P,都感觉知识有点生疏了。刚才写东西遇到个小小的问题,故发帖求助各位:
代码如下,运行提示“文件被占用,无法打开”。???,谢!

  1. @echo off
  2. echo;>nul 3>abc.txt
  3. echo abc
  4. echo;>nul 4>con
  5. start "" "abc.txt"
  6. pause
复制代码
发表于 2010-1-26 17:36:56 | 显示全部楼层
这是个已知的问题了吧,换种方案如何?

参考:提高批处理代码效率的常用技巧及方案
http://www.bathome.net/thread-4831-1-1.html
 楼主| 发表于 2010-1-26 18:17:39 | 显示全部楼层
换方法是可以,但是我想知道原因
发表于 2010-1-26 21:26:02 | 显示全部楼层
  1. @echo off
  2. echo;>nul 3>abc.txt
  3. echo abc
  4. echo;>nul 4>con
  5. start notepad.exe abc.txt
复制代码
 楼主| 发表于 2010-1-26 22:00:36 | 显示全部楼层

回复 4楼 的帖子

这样测试可以。。。
感觉有点诡异
发表于 2010-1-26 22:02:37 | 显示全部楼层
另一个程序正在使用此文件,进程无法访问。

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

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

Q:为什么这里ABC.TXT会被当为程序呢?
A:请参看START /?。
Q:当发现ABC.TXT不是程序时会怎么样呢?
A:这时会根据其扩展名用默认程序打开(.TXT一般默认是用记事本)。
 楼主| 发表于 2010-1-26 22:27:41 | 显示全部楼层

回复 6楼 的帖子

我之前没加echo;>nul 4>con这句,还好理解。后面我想到了,就加了这句。就好比告诉了批处理,后面句子返回的信息不用再定向到ABC.TXT中去了。那怎么还会是“编辑”状态呢?
发表于 2011-5-19 15:06:16 | 显示全部楼层
句柄备份好复杂
发表于 2011-5-19 23:00:59 | 显示全部楼层
3>1.txt 4>1.txt echo 每个文件一个时间点对应的写入句柄唯一
发表于 2011-5-19 23:43:02 | 显示全部楼层
7# zhouyongjun
echo;>nul 4>con之后
abc.txt文件本身并没有被关闭
因为abc.txt的所在的句柄1是被con“非法抢占”的
所以此时访问abc.txt仍然是共享冲突

这与正常执行重定向的语句不同
在语句执行结束后cmd会关闭文件
发表于 2011-5-20 01:12:50 | 显示全部楼层
本帖最后由 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占用,而且是以只写属性打开的。
发表于 2011-5-20 07:57:07 | 显示全部楼层
11# applba

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

另外关于句柄备份中打开的文件句柄
直到当前打开的cmd关闭后才会被关闭
参见下面的链接
http://www.bathome.net/thread-7825-1-1.html
发表于 2011-6-15 20:22:31 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
qzwqzw + 1 多些纠正我的我的错误!

查看全部评分

发表于 2011-8-5 17:57:35 | 显示全部楼层
回复 12# qzwqzw

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

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 00:17 , Processed in 0.022676 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表