你目前正处于脱机状态,正在等待 Internet 重新连接

如何移动当前正在使用的文件

概要
有时,Win32 应用程序需要删除、重命名或移动系统当前正在使用的文件。一个常见的例子就是安装程序在完成软件包的安装后,需要从用户硬盘中将它自身删除。有时,这些应用程序还需要移动系统当前正在使用的设备驱动程序。它们需要操作系统的帮助才能删除或移动这些文件。

Windows 95 和 Windows NT 分别提供了一种独特的方法,来帮助应用程序删除、替换或重命名正在使用的文件和目录。尽管这两个平台实现这些方法的方式有所不同,但它们具有一个共同的整体策略,即由应用程序指定要处理的文件,然后系统在重新启动时对这些文件进行处理。本文阐述应用程序如何使用各个 Windows 平台提供的方法。
更多信息

在 Windows NT 中移动文件

在 Windows NT 上运行的基于 Win32 的应用程序应结合使用 MoveFileEx() 和 MOVEFILE_DELAY_UNTIL_REBOOT 标志来移动、替换或删除当前正在使用的文件和目录。在系统下次重新启动时,Windows NT 启动程序就会移动、替换或删除指定的文件和目录。

要移动或替换正在使用的文件或目录,应用程序必须同时指定位于同一卷(例如,驱动器 C:)上的源路径和目标路径。如果目标路径是现有文件,它将被覆盖。如果目标路径是现有目录,它不会被覆盖并且源路径和目标路径都将保持不变。下面是一个移动或替换文件或移动目录的调用示例:
   // Move szSrcFile to szDstFile next time system is rebooted   MoveFileEx(szSrcFile, szDstFile, MOVEFILE_DELAY_UNTIL_REBOOT);				
要删除文件或目录,应用程序必须将目标路径设置为 NULL。如果源路径是一个目录,则只有在它为空时才能将它删除。请注意,如果您必须使用 MoveFileEx() 将文件从某个目录中删除,则必须重新启动计算机,然后才能调用 MoveFileEx() 来删除该目录。下面是一个如何删除文件或清空目录的示例:
   // Delete szSrcFile next time system is rebooted   MoveFileEx(szSrcFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);				

在 Windows 95 中移动文件

Windows 95 没有实现 MoveFileEx(),但是它为所有基于 Win32、基于 16 位 Windows 和基于 MS-DOS 的应用程序提供了另一种移动、替换或删除当前正在使用的文件(但不是目录)的方法。此功能是通过名为 Wininit.ini 的文件的 [rename] 节实现的。如果 Windows 目录中存在 Wininit.ini 文件,Wininit.exe 会在系统启动时处理该文件。处理完 Wininit.ini 后,Wininit.exe 会将其重命名为 Wininit.bak。

[rename] 节的语法如下:
   DestinationFileName=SourceFileName				
DestinationFileName 和 SourceFileName 必须位于同一卷上并且必须是短 (8.3) 文件名,因为 Wininit.ini 在保护模式的磁盘系统加载之前被处理,而长文件名只有在保护模式的磁盘系统正在运行时才可用。在 Wininit.ini 中使用长文件名指定的目标和源文件会被忽略。

[rename] 节可以包含多行,每行一个文件。要删除文件,请将 DestinationFileName 指定为 NUL。下面是一些项的示例:
   [rename]   NUL=C:\TEMP.TXT   C:\NEW_DIR\EXISTING.TXT=C:\EXISTING.TXT   C:\NEW_DIR\NEWNAME.TXT=C:\OLDNAME.TXT   C:\EXISTING.TXT=C:\TEMP\NEWFILE.TXT				
第一行删除 Temp.txt。第二行将 Existing.txt 移动到一个新目录。第三行移动并重命名 Oldname.txt。第四行用 Newfile.txt 覆盖现有文件。

应用程序不能使用 WritePrivateProfileString() 将项写入 [rename] 节,因为可能有多个具有相同 DestinationFileName 的行,当 DestinationFileName 为“NUL”时尤其如此。相反,应通过分析 Wininit.ini 并将各个项追加到 [rename] 节的末尾来添加项。

注意:请始终使用不区分大小写的搜索来分析 Wininit.ini,因为 [rename] 节的标题和其中的文件名可能包含大小写字母的任意组合。

使用 Wininit.ini 的应用程序应检查 Windows 目录中是否存在该文件。如果存在 Wininit.ini,则自系统上次重新启动以来,其他应用程序已向该文件写入了数据。因此,该应用程序应打开该文件并向 [rename] 节中添加项。如果不存在 Wininit.ini,则该应用程序应创建该文件并向 [rename] 节中添加项。这样做可确保您的应用程序不会无意中删除其他应用程序写入的项。

要在系统重新启动之前撤消文件重命名操作,必须从 Wininit.ini 文件的 [rename] 节中删除相应的行。
update install setup
属性

文章 ID:140570 - 上次审阅时间:11/25/2004 10:55:00 - 修订版本: 4.3

Microsoft Win32 Application Programming Interface

  • kbhowto kbapi kbprogramming kbkernbase kbfileio KB140570
反馈