【问题标题】:Strange behavior from .NET regarding file paths.NET 关于文件路径的奇怪行为
【发布时间】:2013-03-16 13:32:30
【问题描述】:

我无法通过 Google 教授找到有关此的任何信息,所以我在这里。获取给定的路径名​​并将其粘贴到 Windows 资源管理器中。在我的代码中发现生成带有额外“。”的路径的错误后,我偶然发现了这一点。在目录之前的路径名\分隔符...

@"C:\\pathto.\file.ext"

在代码中,.NET 会在调用File.Create 时接受路径并生成一个文件,但是在这个路径:

@"C:\\pathto\file.ext"

C:\\pathto.\file.ext 复制到Windows 资源管理器的地址栏中并查看“.”消失并带你去C:\\pathto\file.ext

.NET 和 Windows 的正常行为是否不会导致问题,因为 '.'传递给文件操作时,.NET 和 Windows 都将其删除。真正的问题是数据库中的所有文件的文件名都带有'.\',但存在于没有'.\'的路径中......并且File.Exists()也可以工作,尽管路径不是'真实的物理位置...

这是怎么回事?

【问题讨论】:

  • 首先,您可以更轻松地复制和粘贴路径,例如使用。 @"C:\Users\Matt" 格式(“逐字字符串”)。
  • 也许 Windows 禁止以 . 开头或结尾的文件名(和文件夹)?
  • 是的,这很正常。尝试创建一个以句号结尾的文件夹也是如此。
  • 你知道.是当前目录的简写,就像..是父目录的简写一样,对吧? en.wikipedia.org/wiki/Path_(computing)
  • @ColonelPanic 以. 开头在Win32 上很好,但你不能使用资源管理器来创建这样的文件。这些文件在与基于 unix 的软件交互时很常见,例如 .git.htaccess、...

标签: c# .net windows file-io pathname


【解决方案1】:

这是 Windows 文件系统的“功能”。 MSDN:

不要以空格或句点结尾的文件或目录名称。尽管底层文件系统可能支持此类名称,但 Windows shell 和用户界面不支持。但是,可以将句点指定为名称的第一个字符。例如,“.temp”。

【讨论】:

    【解决方案2】:

    当传入常规路径时,所有普通 Windows API 都会忽略/删除文件/文件夹名称中的尾随点。

    如果您确实需要对尾随点的支持,您需要使用 "\\?\" 前缀路径并自己互操作所有调用(因为 .Net 不支持这种文件格式)。请参阅MSDN: Naming Files, Paths, and NamespacesHow to delete a folder that name ended with a dot (".")?You cannot delete a file or a folder on an NTFS file system volume 了解更多信息。

    这里是显示如何 PInvoke 接受长文件路径的函数的相关问题:c# call Win32 API for long file paths?

    【讨论】:

      猜你喜欢
      • 2019-01-20
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      相关资源
      最近更新 更多