Excel vba只杀死指定的扩展名

时间:2018-06-07 08:57:07

标签: excel vba excel-vba

我试图删除扩展名为xls

的所有文件
Sub testt()
downloadF = Environ("USERPROFILE") & "\Downloads\*.xls"

Kill downloadF

End Sub

但它也会使文件.xlsx.xlsm以及所有内容.xls*

为什么?

如何仅杀死*.xls

4 个答案:

答案 0 :(得分:6)

我有一个关于为什么会发生这种情况的理论,但我还没有证明这一点......与此同时我发现另一种只删除目标文件的方法是引用文件& #39; s"短" (8.3)姓名

例如,当我第一次检查我的( NTFS )驱动器时,在命令提示符下使用带有/X的{​​{1}}开关:

  

Dir 的简称为 t.xlsx

dir

...和TF99B~1.XLS

dir /x

...并且以编程方式:

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的限制。

更多信息

答案 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。 但是,您可以尝试以下方法:

  1. 打开Windows中的任何文件夹
  2. 转到“查看”
  3. 选项
  4. 查看
  5. 取消选中“隐藏已知文件类型的扩展程序”
  6. 点击确定
  7. 了解正在发生的事情

答案 3 :(得分:1)

我没有解释,但发现了一些奇怪的事情。 我创建了2个文件,一个test1.xlstest2.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上测试)