我试图删除扩展名为xls
Sub testt()
downloadF = Environ("USERPROFILE") & "\Downloads\*.xls"
Kill downloadF
End Sub
但它也会使文件.xlsx
和.xlsm
以及所有内容.xls*
为什么?
如何仅杀死*.xls
?
答案 0 :(得分:6)
我有一个关于为什么会发生这种情况的理论,但我还没有证明这一点......与此同时我发现另一种只删除目标文件的方法是引用文件& #39; s"短" (8.3
)姓名:
例如,当我第一次检查我的( NTFS )驱动器时,在命令提示符下使用带有/X
的{{1}}开关:
Dir
的简称为t.xlsx
...和TF99B~1.XLS
:
...并且以编程方式:
Dir /x
正如@Pᴇʜ指出的那样,如果从文件中删除它们,例如。用:
Option Explicit
Private Declare Function GetShortPathNameA Lib "kernel32" _
(ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Public Function ShortPath(ByVal fName As String) As String
Dim fNum As Integer, strBuffer As String * 255
fNum = FreeFile
If Dir(fName) = "" Then
On Error Resume Next 'Create file if it doesn't exist
Open fName For Output As #fNum
Close #fNum
End If
ShortPath = Left$(strBuffer, GetShortPathNameA(fName, strBuffer, 255))
End Function
... fsutil 8dot3name strip c:\temp\test
命令按预期工作(不 kill Kill
)。
xlsx
:删除位于指定 fsutil 8dot3name strip
中的所有文件的8dot3
个文件名。对于 DirectoryPath
与文件名组合包含 260个字符的文件,不会删除8dot3
文件名。
此命令列出但不修改指向DirectoryPath
文件名永久删除的文件的注册表项。
有关从文件中永久删除8dot3文件名的效果的详细信息,请参阅Remarks。
...并通过命令行,一次查看整个文件夹或卷:
查询磁盘卷的禁用
8dot3
名称行为 对于特定的音量,请使用:8dot3
您还可以使用
fsutil 8dot3name query Volume{xyz-VolumeGUID-xyz}
查询8dot3
名称行为 子命令。在
behavior
目录中删除 8dot3文件名 子目录,同时将信息写入日志文件 指定为D:\MyData
,键入:mylogfile.log
更多信息:
' 来源 :Naming Files, Paths, and Namespaces(Microsoft)
所有文件系统都遵循单个文件的相同通用命名约定:基本文件名和可选扩展名,以句点分隔。但是,每个文件系统,例如 NTFS , CDFS , exFAT , UDFS , FAT 和 FAT32 ,可以对目录或文件路径中各个组件的形成有特定的和不同的规则。
。 。
字符数限制也可能不同,具体取决于所使用的文件系统和路径名前缀格式。 通过支持向后兼容机制,这进一步复杂化。例如,较旧的
fsutil 8dot3name scan /l mylogfile.log /s d:\MyData
MS-DOS
文件系统支持最大 8个字符对于基本文件名,扩展名为3个字符 ,总共12个字符,包括点分隔符。这通常称为FAT
文件名。 Windows FAT和 NTFS 文件系统不限于8.3
文件名,因为它们具有长文件名支持,但它们仍支持8.3
版本的长文件名。
8.3
Win32文件命名空间
对于文件I / O,路径字符串的\\?\
前缀告诉Windows API禁用所有字符串解析并将其后面的字符串直接发送到文件系统。例如,如果文件系统支持大型路径和文件名,则可以超出Windows API强制执行的\\?\
限制。有关正常最大路径限制的详细信息,请参阅最大路径长度限制部分。
因为关闭了路径字符串的自动扩展,MAX_PATH
前缀还允许在路径名中使用\\?\
和..
,如果您尝试使用这些保留的相对路径说明符作为完全限定路径的一部分对文件执行操作,则会很有用。
许多但不是所有文件I / O API都支持.
;您应该查看每个API的参考主题以确定。
\\?\
Win32设备命名空间
\\.\
前缀将访问 Win32设备命名空间,而不是 Win32文件命名空间。如果API支持此类访问,则无需通过文件系统即可直接访问物理磁盘和卷。您可以通过这种方式访问磁盘以外的许多设备(例如,使用\\.\
和CreateFile
功能。)
NT命名空间
还有一些API允许使用NT命名空间约定,但 Windows对象管理器在大多数情况下都不需要这样做。为了说明,使用Windows DefineDosDevice
Sysinternals
工具浏览系统对象浏览器中的Windows命名空间非常有用。当您运行此工具时,您看到的是从根开始的NT命名空间,或WinObj
。名为\
的子文件夹是Win32命名空间所在的位置。
FAT命名惯例
来源:Overview of FAT, HPFS, and NTFS File Systems(微软)
FAT使用传统的
Global??
文件命名约定,并且必须使用ASCII
字符集创建所有文件名。文件或目录的名称最长可达八个字符,然后是句点8.3
分隔符, 最多可达三个字符的扩展名 。名称必须以字母或数字开头,并且可以包含除以下内容之外的任何字符:
.
如果使用任何这些字符,可能会出现意外结果。名称不能包含任何空格。
NTFS命名约定
文件和目录名称最长可达255个字符,包括任何扩展名。名称保留大小写,但不区分大小写。 NTFS根据大小写不区分文件名。名称可以包含除以下内容之外的任何字符:
. " / \ [ ] : ; | = ,
目前,从命令行,您只能创建最多253个字符的文件名。
注意:基础硬件限制可能会在任何文件系统中施加额外的分区大小限制。特别是,启动分区的大小只有7.8 GB,分区表中有2 TB的限制。
MSDN: DeleteFile function
答案 1 :(得分:3)
尝试
Option Explicit
Public Sub DelFiles()
Dim fso As Object, fol As Object, f As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set fol = fso.GetFolder(Environ$("USERPROFILE") & "\Downloads")
For Each f In fol.Files
'Debug.Print f
If fso.GetExtensionName(f) = "xls" Then Kill f
Next f
End Sub
答案 2 :(得分:1)
Kill Environ("USERPROFILE") & "\Downloads\*.xls"
只能杀死.xls
。
但是,您可以尝试以下方法:
答案 3 :(得分:1)
我没有解释,但发现了一些奇怪的事情。
我创建了2个文件,一个test1.xls
和test2.xlsx
。我将这些文件复制到了不同的地方:
%userprofile%\downloads
%userprofile%\documents
C:\junk
U:\junk
(其中U:是网络共享)G:\MyDrive\MyDocs\junk
(其中G:由Google文件流创建)对于前三种情况(文件位于C:\
),VBA命令dir *.xls
以及命令提示符dir *.xls
列出了两个文件,而对于&#34外源#34;驱动器,仅列出了test1.xls
。我假设kill
使用了相同的逻辑。
(在Windows 10上测试)