如何获取最终文件名

时间:2014-03-13 08:34:22

标签: c# file-io

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

例如:

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

“ASD”。和“asd ..”

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

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

将其保存在硬盘驱动器上(例如使用StreamWriter)后,只有一个文件“asd”

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

修改

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

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

3 个答案:

答案 0 :(得分:4)

.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);

答案 1 :(得分:2)

如果使用FileStream打开文件,则可以在打开流后使用FileStream.Name属性来获取" final"文件名。

一个粗略的例子:

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();

答案 2 :(得分:0)

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

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

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

以下是一些更多信息:Strange behavior from .NET regarding file paths

相关问题