【问题标题】:Trouble getting file name from file path从文件路径获取文件名时遇到问题
【发布时间】:2013-07-08 17:02:42
【问题描述】:

如何从文件路径获取文件名,文件可以从不同的 OSX 或 windows 上传。
正在努力实现的目标和挑战如下:

  • 我的目标是清理文件名,如果它有任何非法字符。 示例:OSX 允许 \ 和一些 Windows 文件系统不允许的其他字符。 alg 将 \ 替换为 _
  • 有时某些浏览器 (IE) 会将整个路径作为文件名发送到我的代码。因此,如果我在 Windows 中从网络上传共享文件,IE 会将名称发送为\\\\servername\\folder\\filenmae.txt

-- 我不能使用文件信息或路径,因为来自 OSX 的文件名可能包含非法字符,例如 |><,并且因为如果 Mac OSX 中的文件名是 @987654328 @、fileinfo 或 path 给我“文件”作为文件名而不是全名。

-- 现在,如果文件名在路径中有 :\,我可以很容易地提取文件名使用 filename.Substring(filename.LastIndexOf(@"\") + 1)
-- 但我的问题在于共享文件,因为 Windows 中的共享文件完整路径模式可以是 OSX 中的文件名。

我怎样才能得到全名?
任何建议将不胜感激。

【问题讨论】:

  • 您无法知道 \\a\b\c.txt 是来自 Windows 的完整路径还是来自 *nix 的异常文件名。
  • 在 OSX 中应用于文件名的规则是什么?
  • 请谷歌!,我知道 :-)
  • @DineshB 当然我是在开玩笑说 OSX。 :) 这似乎很难。虽然你可以尝试一个小实验。如果您在 Windows 和 OSX 之间共享文件,是否会出现同样的问题(例如,如果您的 MAC 上有一个奇怪的文件名,您可以通过 Windows 访问它)吗?
  • 好问题!如果您尝试复制它可能会给您一个错误

标签: c# .net


【解决方案1】:

我想你想使用Path的静态方法:

Path.GetFileName(string);Path.GetDirectoryName(string);

【讨论】:

  • 不适用于OSX,osx中文件的示例文件名是test/\.txt,抛出异常,其次如果文件名是路径怎么办,这在OSX中是正确的。
【解决方案2】:

正如其他人指出的那样;这行不通。您无法创建适用于所有操作系统的文件名,甚至无法创建适用于单个操作系统中所有文件系统的文件名。我在尝试将 NTFS 文件从 Windows 复制到 ISO 9660 驱动器时遇到了这个问题。

不要尝试“清理”文件名;规则太不可靠,并且跨文件系统发生冲突。使用操作系统的 API 来构造文件,例如 System.IO.Path.GetTempFileNameSystem.Windows.Controls.OpenFileDialog。如果您尝试以编程方式构建文件名,请将您认为适用于所有客户端文件系统的名称(如“MyFile”加上递增的序列号或十六进制 GUID)传递给 API,并为文件系统异常做好准备工作。

如果您要跨文件系统复制文件,最好存储原始文件名以显示给用户,并将其用作文件保存对话框等的默认设置,但同样,不要编写您的程序依靠他们。

【讨论】:

  • 我明白,但是,如果有人从 OS X 上传文件名文本/\.txt 的文件,而另一个人尝试在 Windows 上下载,该怎么办。 (忽略我如何将它存储在服务器上)
  • 在 UI 中向此人显示名称“text/\.txt”。如果您尝试将其保存在 Windows 上,它会抛出,您将不得不让用户重试或创建您自己的名称。但这可能发生在用户的任何文件名上;名称是否来自不同的文件系统无关紧要。
  • 好主意,但我的任务是重命名这些文件。截至目前的临时解决方案 - 尝试 { filename = path.getFileName(fileName) } catch(Exception e) { if(!(e is ArgumentException)) throw;} filename=renameFileName(fileName);
  • 不要将fileName传递给renameFileName;如果fileName 抛出您无法可靠地确定原因。相反,renameFileName 应该使用依赖于文件系统的规则来创建新名称。
  • @DineshB,请注意仅由有效字符(例如“....”)组成的文件名可以抛出。有效的文件名(例如“PRN”)可以抛出。
【解决方案3】:

感谢所有回复,特别感谢@Dour High Arch。终于想出了解决办法。使用 fileInfo 类,也可以使用 Path 完成,但尚未测试。

try
{
  FileInfo fileInformation = new FileInfo(tempFileName);
  String directory = fileInformation.DirectoryName;
  if (tempFileName.StartsWith(directory))
  {
    filename = fileInformation.Name;
  }
}
catch (Exception arugmentException)
{
   if (!((arugmentException is ArgumentException) || 
     (arugmentException is NotSupportedException))) throw;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 2011-11-16
    • 2022-01-01
    • 1970-01-01
    • 2021-10-18
    • 2021-07-15
    • 2012-01-21
    • 2015-04-22
    相关资源
    最近更新 更多