【问题标题】:How to get final filename如何获得最终文件名
【发布时间】:2014-03-13 08:34:21
【问题描述】:

在 c# 中获取最终文件名时遇到问题。

例如:

如果用户键入两个文件名:

“自述。”和“asd..”

或

“asd”和“asd ”(两个空格)

然后方法 Path.GetFileName 返回“asd.”、“asd..”、“asd”、“asd  ”(两个空格)。

将其保存到硬盘后(例如使用 StreamWriter),则只有一个文件“asd”

如何查看输入文件的最终名称?我想还有很多其他的例子,我永远无法手动正确地完成。

编辑:

我用它来比较两个文件名,GetFileName 返回: 对于 a.txt - a.txt 对于 A.txt - A.txt

但保存后是同一个文件。比较必须忽略大小写。

【问题讨论】:

  • 显示您的代码,以便我们看到并帮助您
  • 我不认为近距离投票是合理的。这是一个关于编程的合法问题,实际上不需要任何示例代码。问题很清楚:例如,当 SaveFileDialog 将文件名报告为“ads...”并保存时,操作系统将把文件重命名为“ads”。您如何确定发生了这种情况?
  • 有趣的问题。该行为未(显然)记录在 msdn 的参考资料中。就NTFS(或FAT32?)而言,当然可以创建一个名称中带有尾随空格的文件,我只是在cygwin shell中完成的。但是资源管理器似乎将文件名作为同一个文件处理,并且当我尝试添加空格时拒绝重命名它(“源和目标是同一个文件”)。类似于在 Windows 下会困扰 Java 开发人员的不连贯的大小写处理。
  • @Adam 你真的应该考虑将 Ulugbek 标记为你问题的正确答案,他真的做到了

标签: c# file-io


【解决方案1】:

.Net 的 Path 类中有一个有趣的内部 NormalizePath 方法。如果你不介意反射,你可以使用它。

string fileName = "asd..";
MethodInfo normalizePathMathod = typeof(Path).GetMethod("NormalizePath", BindingFlags.Static | BindingFlags.NonPublic, null, new Type[] { typeof(string), typeof(bool) }, null);
string normalizedFilePath = (string)normalizePathMathod.Invoke(null, new object[] { fileName, true });
string normalizedFileName = Path.GetFileName(normalizedFilePath);

刚刚找到更好的解决方案,没有反思。 Path.GetFullPath 调用 NormalizePath 方法。所以我们可以把它改成:

string fileName = "asd..";
string normalizedFilePath = Path.GetFullPath(fileName);
string normalizedFileName = Path.GetFileName(normalizedFilePath);

【讨论】:

  • 很好,没想到
  • 不错的解决方案,尤其是没有反射的解决方案!
【解决方案2】:

如果您使用FileStream 打开文件,则可以在打开流后使用FileStream.Name 属性来获取“最终”文件名。

一个粗略的例子:

SaveFileDialog sDlg = new SaveFileDialog();

if (sDlg.ShowDialog() == DialogResult.OK)
{
     // E.g., sDlg.FileName returns "myFile..."
     FileStream f = new FileStream(sDlg.FileName, FileMode.Create);
     Console.WriteLine(f.Name); // then f.Name will return "myFile"
     f.Close();
     Console.ReadLine();
}
sDlg.Dispose();

【讨论】:

    【解决方案3】:

    在 Windows 7 下,我无法将文件从 test 重命名为 test。 (它恢复为测试)所以我认为重命名来自对文件执行特定规则的文件系统,而不是.Net。

    即使使用互操作调用,您也无法创建带有尾随点的文件。我真的不认为您可以从.Net 内部获得更正的文件名。 [编辑:事实上,Ulugbek 的回答显示了一个非常好的方法]

    一种解决方案可能是将具有该名称的空文件写入临时目录,并在删除之前检查生成的文件名。

    这里有更多信息:Strange behavior from .NET regarding file paths

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2011-03-08
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      相关资源
      最近更新 更多