1

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

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

- 我不能使用 fileinfo 或 path,因为来自 OSX 的文件名可能包含非法字符,例如|, >,<并且因为如果 Mac OSX 中的文件名是\\path\ex\file, fileinfo 或 path 给我“文件”作为文件名而不是全名.

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

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

4

3 回答 3

2

我认为您想使用以下静态方法Path

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

于 2013-07-08T17:07:25.447 回答
1

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

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

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

于 2013-07-08T18:23:33.090 回答
0

感谢所有回复,特别感谢@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;
}
于 2013-07-08T21:30:44.147 回答