标题: 删除文件
[打印本页]
作者: wangyu824
时间: 2005-8-12 20:16
标题: 删除文件
我的目录是d:\kaoshi\error\event\add.pas
我要删除event子目录,dos命令怎么输入???
作者: willsort
时间: 2005-8-12 20:35
Re wangyu824:
鉴于此类问题分属于基本的DOS命令理解范畴,请仔细阅读DOS的帮助文档和网络教程,或者将此类问题发表在“入门室”。谢谢合作!
作者: wangyu824
时间: 2005-8-12 20:54
willsort,你还不如直接告诉我
入门室在哪点吗?我没找到,网址?
作者: Michael
时间: 2005-8-12 21:07
没错,这个问题太简单了,以至于没人敢回答你。
作者: wangyu824
时间: 2005-8-12 21:14
Michael
回答老又不死人,告诉我哈啥!!!菜鸟向给位大虾请教老
作者: fdsiuha
时间: 2005-8-12 21:32
绝对路径 相对路径 和当前目录的关系
所谓 绝对路径 ,就是该目录的完整路径。
譬如 d:\kaoshi\error\event\add.pas 包括了盘符(最顶级目录)和完整的各级目录。
譬如 ..\event\add.pas 这就是一个相对路径,与你现在的当前目录相关联,如果你的当前,目录是d:\kaoshi\error\event,那么..\event\add.pas代表的是d:\kaoshi\error\event\add.pas,但是如果你现在处于d:\kaoshi\那么代表的是d:\event\add.pas。
无论在什么情况下,绝对路径都是可以使用的。你现在已经在d:\kaoshi\error\event\目录下了,所以要对这个目录进行操作,你可以:
1. rd . 其中.的意思是当前目录
2. rd ..\event 其中..的意思是上一级目录
还可以以此类推
一直到
rd d:\kaoshi\error\event\
就是将完整的路径写在后面
这样做了你的DOS提示符还是
d:\kaoshi\error\event>_
但是注意,用DIR命令列表的时候就会少了.和..两项。表示这个目录已经不存在了
最后要注意,rd命令是只删除空目录的,你的这个目录下有文件的话使用deltree命令代替,前提条件是你的硬盘上要有这个外部命令。
我很早的时候也曾经茫然过这个问题^^。但是希望楼主注意发帖的位置。与人方便,与己方便。还有就是不要使用方言或别字。
*******以上内容只能在WIN9X的DOS窗口使用*******
***纯DOS以及NT下的CMD命令不允许删除当前目录****
[
Last edited by fdsiuha on 2005-8-15 at 10:11 ]
作者: xy2fengye
时间: 2005-8-12 22:29
可能用deltree命令
deltree d:\kaoshi\error\event
作者: Michael
时间: 2005-8-12 23:09
还有,就是搞清楚目录和文件的区别。
作者: fdsiuha
时间: 2005-8-13 09:55
汗...
不会...add.pas又是一个子目录吧
作者: Climbing
时间: 2005-8-13 14:08
当版主遇到象顶楼这样的菜鸟的时候,是对自己修养的一种严峻考验。
顶楼的同学,我无意于贬低你的任何什么,但你也要理解,当版主也是很不容易的。
作者: willsort
时间: 2005-8-13 20:14
Re wangyu824:
我所说的“入门室”,是指本论坛(中国DOS联盟联合DOS论坛)的
DOS學習入門 & 精彩文章 (教學室),那里有很多人乐意回答你的此类问题。
在此我更正“入门室”的称谓,应该是“教学室”,对因此而使你产生的困惑,我表示十分抱歉!
Re fdsiuha:
对绝对路径、相对路径和当前目录的表述,我基本无异议。在此仅对你使用的RD示例表示存疑。
无论是在MSDOS还是在Window的命令行中,都应该是无法删除当前目录和它的上级目录的,因为若正确执行此命令,对当前路径的引用将引发不可知的问题。
在MSDOS6.22中提示"Attempt to remove current directory - .";
在XP的CMD中提示“另一个程序正在使用此文件,进程无法访问。”
另外,无论在何种情况下,DIR的目录列表都应该会存有.和..的引用的,你所说的情况我从未遇到,不知是否可以举出你所做的测试?
[
Last edited by willsort on 2005-8-14 at 07:19 ]
作者: fdsiuha
时间: 2005-8-13 21:02
可以的,你可以在WIN98下测试这个结果
先建立一个目录 a
然后进入到这个目录 cd a
这样的目录结构就是 c:\windows\desktop\a
当前目录 c:\windows\desktop\a
然后删除他 rd c:\windows\desktop\a
或者 rd ..\a
那么,所以以上操作完成之后,现在的提示符仍然为c:\windows\desktop\a>_
在这个情况下列表 dir
屏幕显示如下:
C:\WINDOWS\Desktop>md a
C:\WINDOWS\Desktop>cd a
C:\WINDOWS\Desktop\a>rd ..\a
C:\WINDOWS\Desktop\a>dir
Volume in drive C has no label
Volume Serial Number is 405D-140B
Path not found
C:\WINDOWS\Desktop\a>cd c:\windows\desktop\a
Invalid directory
C:\WINDOWS\Desktop\a>
因为这个时候不存在当前目录的概念了,所以不会有与之关联的本级目录和上级目录的概念。^_^
但是值得说明的一点是,如果这个时候使用了其他需要当前目录的程序,是会出一点问题的,比如会报告“找不到文件”,因为现在没有“当前目录”的概念了。
从编程的角度来说,对于汇编和C语言来说,DOS的环境变量只是内存中一块没有保护,也不用保护的数据块,或者是一个全局变量,那里都可以存取的。但是明显在WINNT模式下不允许这种“纯DOS的行为”。
所以在这个层面上对于DOS来说,DOS7.1要比6.22的目录管理功能灵活一些,能够允许对当前目录进行有限度的操作。要说是问题的话,那这只能说是DOS自身不完善的问题,谁让它这样管理这些环境变量的呢。但这样的操作实际对DOS单任务操作系统,本身是没有什么太大危害的,最多给个出错提示。这是完全可以控制和预料的。
98仍然是DOS的一个GUI,其中的每一个DOS窗口都是不完全独立的DOS,但当前目录对DOS而言只是环境变量的一个部分,还没有上升到系统资源的地步。故每一个DOS窗口都有一个属于自己的不同的环境变量,实际与纯DOS并无本质区别。
至于CMD运行的是WIN32保护模式下的,我是这样认为的,当前这个概念已经上升到系统资源的级别。就算了同一个进程,对只能独占的资源的所进行的操作是不能同时并发进行。。虽然CMD表面上看来确实像一个DOS,但它并不是DOS,甚至不是模拟器+DOS,只是一个模拟的DOS环境,只是一个有图形命令行的WIN32普通程序罢了,与EXPLORER.exe都没有什么本质的区别。而上面的操作,对于一个严格的WIN32程序来说,这样自然是不可以以接受的。
如果有什么不妥的地方希望大家不吝指正,我也是菜菜的^^。
[
Last edited by fdsiuha on 2005-8-13 at 21:55 ]
作者: Climbing
时间: 2005-8-13 21:18
这大概是98的一个bug,我在2003下是无法测试这个结果的。
另外,也不是所有的目录都有.和..的相对路径的,例如磁盘的根目录。
作者: GOTOmsdos
时间: 2005-8-13 21:24
我在XP下试了, 不给删,98没试
作者: fdsiuha
时间: 2005-8-13 21:59
我对后面两位的帖子做了一些说明和修改,就在原文上。可能会造成一些发贴顺序的逻辑混乱,勿怪^^。
作者: willsort
时间: 2005-8-13 22:36
Re fdsiuha:
对你提供测试示例表示感谢,是我孤陋寡闻了。
目前为止,我在Win98的命令行下可以完成以上测试,包括rd .的测试。但是在Win98的DOS模式下,此测试仍然无法通过。这似乎说明,这是某种Windows的机制在起作用(可能与进程间的消息传递方式有关),而非你所说的DOS的环境变量管理的疏漏。
而且,我也不倾向将当前目录看作环境变量,因为它毕竟不在环境变量空间保存,无论是公共空间,还是每个DOS窗口自己的私有空间,除非将它看作一种广义上的“环境变量”。但是因为我尚未得知这个当前目录的具体保存位置,所以无法作出更准确的判断。
你知道得更多吗?
[
Last edited by willsort on 2005-8-14 at 07:15 ]
作者: fdsiuha
时间: 2005-8-14 00:40
当然 当前目录作为整个DOS系统的参数是不用具体提供给某个程序,但应该在PSP中间引用。但是具体位置尚不知晓,实际上这个比提供给程序的环境变量要低级,一般不需要特别应用,我用C从来就没有碰到过要使用这个的必要(汗)。我努力在网找一下,看看有没有外文的资料。
另外你说的在完全的DOS环境下不能使用,我还在找原因..。
[
Last edited by fdsiuha on 2005-8-14 at 00:41 ]
作者: fdsiuha
时间: 2005-8-14 01:07
转洪恩的网页,注意CDS项
Quote: |
你想详细了解你的设备驱动程序吗?
你想直接通过内存了解软件内容吗?
你想了解磁盘的盘体逻辑结构信息吗?
那就让我们一起来学习DOS系统中的一个重要的数据结构-系统内部参数表,又称表之表(List of lists-LOL)。
调用未公开的DOS中断21h的52号系统功能可获取LOL的表首地址于ES:BX中。
1、将BX减8h,即LOL-8h处的双字单元为当前磁盘缓冲区(Disk buffer)的地址。 DBF的长度为532字节(DOS 6.2,下同),包括20字节的缓冲区控制块和正好容纳一扇数据的512字节的缓冲区。
2、LOL-2h处的字单元为第一个内存控制块MCB(Memory Control Block)的段地址,偏移为0。
MCB的长度为16字节。 首字节为标志位,为“Z”(5Ah)表示最后一个内存块,为“M”(4Dh)表示为非最后块。 01h字节单元为0000h表示内存块空闲,否则为拥有此内存块程序的程序段前缀(PSP)的段地址。
03h字节单元表示以节为单位的内存块的大小。
05h 11字节保留。
下一个MCB的段址为现MCB的段址加1,再加上内存块的大小(3-4字节中的数)
3、LOL+0h处的字单元地址为驱动器参数块DBF(Drive Parameter Block)链首地址,即而得到DBF的地址。
DBF长度为33字节,具体意义如下: 00h字节:驱动器号(0=A:,1=B:,2=C:等等)
01h字节:子单元号(unit)
02h字: 每扇字节数
04h字节:簇内最大扇区号(此值加1即为簇扇数)
05h字节:簇大小以2为底的指数
06h字: 保留扇区数
08h字节:FAL的数目
09h字: 根目录区项数
0Dh字: 文件区第一扇的逻辑扇号
0Fh字: 每个FAL的扇数
11h字: 根目录区第一扇的逻辑扇号
13h双字:块设备驱动程序(设备头)的段:偏移
17h字节:介质标志(F8为硬盘)
18h字节:DBF有效标志(为FFFF表示必须重建DBF;为0表示刚用过)
19h双字:下一个DBF的段:偏移(若偏移为FFFF,则本DBF为最后一个)
1Dh字:目录首簇号(0为根目录,1为子目录)
1Fh字:盘上空闲数(-1为未确定)
4、LOL+04h处的双字单元为面向句柄的系统文件表SFT(System File Table)第一个表组的地址。
此SFT表由两个表组组成,每个表项长度为59字节,每个表组有一个6字节的组头,前四个字节为下一表组指针,后两个字节为表组内的项数。
5、LOL+12h处的双字单元的DBF键首地址
6、LOL+16h处的双字单元为当前日期目录结构数组表CDST(Current Directory Structure Table)的首地址。
CDST由若干个CDS组成,每个CDS的长度为88字节,意义如下:
00h 67字节:当前目录的路径名ASCII字符串
43h字:标志记道常为40h
b15位: 1-网络驱动器;0-本地驱动器
b14位: 1-物理驱动器;0-虚拟驱动器
b13位: 1-本驱动器符已被连接到指定路径;否则为0
b12位: 1-本驱动器符被用来代替指定路径;否则为0
b11和b10位:未知
45h双字:此驱动器的DPB的地址(段:偏移)
49h字: 当前目录的首簇号(0:根目录;+1:从未访问过)
4Bh双字:未知
4Fh字: 当前目录的路径名(前67个字节)中,相当于根目录的“\” 符前的字节数(通常为2)
51h~57h:保留
7、LOL+1Ah处的双字单元为面向FCB的SFT表组的头部地址。 此SFT只有一个表组,组头的前四个字节未用,其他同面向句柄的SFT表组。
8、LOL+22h处的字节单元为CDST的表项数,即config.sys 中lastdrive的值在面向句柄的SFT中第一个表组项数为5,第二个表组项数为此值减5。
9、LOL+22h处的双字单元为NUL设备驱动程序的头部,长度 18字节,意义如下:
00h双字:下一设备头的地址(段:偏移)
04h字: 设备属性(b15为1表示字符设备;为0是块设备)
06h-09h 4字节:中断例程入口的段内偏移量
10h-17h 8字节:设备名(字符设备:此域存放逻辑设备名;块设备:只第一字节中写有块设备驱动程序所支持的子单元数目,其余字节为0) |
|
以下引自一个病毒编写技术文章
Quote: |
%DIB(DOS Info Block DOS信息模块)%
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
利用DIB,我们能够访问那些重要的不能利用其它方法访问结构。这个结构并不是固定的在内存中的,我们必须利用INT 21h的52h功能。在DOS文档里没有这个函数的介绍。当我们调用这个函数的时候,我们将会在ES:BX里得到DIB的地址。你将会得到:
___________________________________
| Pointer to first MCB |<---- -0004h
|___________________________________| Size:1 DWORD
| Pointer to first DPB |<-----+0000h
|___________________________________| Size:1 DWORD
| Pointer to DOS last buffer |<-----+0004h
|___________________________________| Size:1 DWORD
| Pointer to $CLOCK |<-----+0008h
|___________________________________| Size:1 DWORD
| Pointer to CON |<-----+000Ch
|___________________________________| Size:1 DWORD
| Maximum sector length |<-----+0010h
|___________________________________| Size:1 WORD
| Pointer to DOS first buffer |<-----+0012h
|___________________________________| Size:1 DWORD
| Pointer to array of cur dir struc |<-----+0016h
|___________________________________| Size:1 DWORD
| Pointer to SFT |<-----+001Ah
|___________________________________| Size:1 DWORD
Total Size:34 BYTES |
|
另外,我试图看一下这个中断究竟是怎样工作的。
还有就是纯DOS7.1确实不能这样应用,我怀疑是不是WIN的与DOS不一样,WINNT内核没有办法试,那位GG现在装了DOS7.1+WIN3.2,帮忙试一试,大家一起来探个究竟。
[
Last edited by fdsiuha on 2005-8-14 at 01:23 ]
作者: fdsiuha
时间: 2005-8-14 01:32
另外DOS提供了另外的一个47h的中断可以正常使用。我困死了,今天先到这里吧.
用DEBUG测试,在删掉当前目录的时候47号功能依然返回的是删除以前的目录。
就是说,当前目录没有发生任何变化。只是不存在了。
单步跟踪47号功能,发现依然是查CDS表,跟踪到的内存地址与52号功能返回地址相同。
另外,再删掉当前目录后马上使用EDIT打开文件会提示目录有问题。估计也是因为使用了这个中断,要按照这个结果搜索当前目录文件的时候自然会发生的问题。
真是搞不懂WIN在干什么,另外有没有人在DOS7.1+WIN3.2做过实验?
[
Last edited by fdsiuha on 2005-8-14 at 11:13 ]
作者: willsort
时间: 2005-8-14 11:40
Re fdsiuda:
我搜索了Win98下所有的command.com,均能找到“Attempt to remove...”这个错误信息字符串。也就是说,无论实际测试结果如何,Win98的原意都并非是将删除当前目录的权限开放,这从另一个侧面佐证了 Climbing 兄关于它是个 BUG 的猜测。这也进一步验证了Win98的“粗放型特征”。至于DOS7+Win3,我没有平台可以验证,但我猜测它的“开放性”并没有如此高。
关于这个问题的成因,我有两个猜测:第一,Win98的进程管理中将删除当前目录的消息过于落后地传递给其它进程,直到进程开始访问当前目录时,这个消息才被动地被执行或者传递;第二个,可能是它不完善的硬盘缓冲机制在起作用,也就是说,删除当前目录的实际操作是在再次访问当前目录之前才被执行的。
但以上的两点推测,都无法说明为什么"Attempt to remove..."为什么被抛弃不用。
作者: fdsiuha
时间: 2005-8-14 13:28
我还是不觉得是个问题,而且觉得应该不会是进程间的原因。每一个DOS窗口都有自己的COMMAND.com的所有特征信息,但是仍然公用基本的DOS系统IO.SYS。这个系统变量只在同一个DOS窗口里面有效。COMMAND.com在启动的时候确实从系统得到当前的目录信息,但是只得到了一个COPY,而不是整个系统的该信息的内存地址类似C语言的传值,而不是给出一个指针,指向系统变量,因为这个是受保护的。
所以纯DOS下绝对不能非法改变这个值,因为这是一个系统级的。但是在WIN98下的DOS窗口是个独立于系统外的,同时也获得了一个系统变量的COPY。当然这个COPY数据是可以自由变化的,我使用DEBUG验证确实每一个DOS窗口都有自己的CDS。
所以我希望能够WIN3.x尝试一下,如果WIN3.x的DOS窗口下与WIN9X一样,那么说明WIN9x允许这样使用,实际是扩展了DOS的功能,而不是一个BUG。
另外DOS6.X+WIN3.X也可以试一下,也可能可以成功。
作者: willsort
时间: 2005-8-14 18:56
Re fdsiuha:
刚才在Virtual PC 5 的 MS-DOS7.1 环境安装了 Windows3.2 简体中文版,在其“ MS-DOS 方式”下进行了测试,结果确认了我的猜测。
Quote: |
Microsoft(R) MS-DOS 7.1
(C)Copyright Microsoft Corp 1981-1999.
C:\WINDOWS>cd\temp\r\a
C:\TEMP\R\A>rd \temp\r\a
Attempt to remove current directory - \temp\r\a
C:\TEMP\R\A>rd ..
Invalid path, not directory,
or directory not empty |
|
作者: fdsiuha
时间: 2005-8-14 20:36
第二个命令是否COPY的时候COPY错了?
第三种命令其实在WIN的DOS窗口也是不能实现的。不能删除父目录,只能删除当前目录 RD .
[
Last edited by fdsiuha on 2005-8-14 at 20:59 ]
作者: willsort
时间: 2005-8-14 20:41
Re fdsiuha:
拷贝过程我一字未易,不知你所说的错误是指非“rd .”吗?我是根据你之前的示例做的测试。当然,我也尝试过 rd . / rd ..\a,也是同样的错误提示。
Quote: |
赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突
? ?Type EXIT and press ENTER to quit this MS-DOS prompt and ?
? return to Windows. ?
? ?Press ALT+TAB to switch to Windows or another application. ?
? ?Press ALT+ENTER to switch this MS-DOS Prompt between a ?
? window and full screen. ?
韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图
Microsoft(R) MS-DOS 7.1
(C)Copyright Microsoft Corp 1981-1999.
C:\WINDOWS>cd\temp\r\a
C:\TEMP\R\A>rd ..\a
Attempt to remove current directory - ..\a
C:\TEMP\R\A>rd .
Attempt to remove current directory - . |
|
[
Last edited by willsort on 2005-8-14 at 20:45 ]
作者: fdsiuha
时间: 2005-8-14 21:06
对不起,是我看错了。这么说确实WIN98在这个地方有问题。我在WINME下试过了,但是还是出现与WIN98同样的情况,我很想知道到底是什么原因造成这种情况,好象还没有E文文献记载这个事情。
DOS一直强调不能删除当前目录,然而WIN9X下却破坏了这个规矩,不知道究竟是何道理。
[
Last edited by fdsiuha on 2005-8-14 at 21:49 ]