【长路经】C#读取文件抛出FileNotFoundException异常

前言

在winform中读取文件信息时,突然抛出了FileNotFoundException的异常,但是本地是有这个文件的。
随后找到了这个文件,查看属性,[位置]属性,多了"\?"的前缀,百度得知这是windows对长路经的处理。

需要注意:
目前在NetFx框架下,才有这个问题。
在NetCore框架下,是正常运行。

复现问题的代码

代码如下

static void Test02()
{
	List<string> dirList = new List<string>()
	{
		"F:\\100-cnblogs_blog",
		"01-all-备份备份备份备份备份备份备份",
		"02-html-备份备份备份备份备份备份备份",
		"03-bak-备份备份备份备份备份备份备份",
		"04-file-备份备份备份备份备份备份备份",
	};
	string basePath = Path.Combine(dirList.ToArray());
	if (Directory.Exists(basePath) == false)
		Directory.CreateDirectory(basePath);
	//假设有这2个文件
	//这个文件是正常=>1.txt
	//这个文件会报错=>6bRLpUwRTXshio75MZtzxmqjtfRlIMXDKFPdAG1f63gdXvxoY5pPPUaermZuHsUfrLI90xSYW8qiYzucUV4GceuHqvpFVaojMkFS5g9mmE5QL5K2YEOkLWFuF2Oboi1JsbCEhMoD77SGczO7GgZX60XPQZuo7hZFP3LKqJ4EHYKL8yjdVAYAwpm737JikdH3OUQ9zOhh.txt
	var files = Directory.GetFiles(basePath, "*.*", SearchOption.AllDirectories);
	foreach (var item in files)
	{
		string fullName = item;
		FileInfo fileInfo = new FileInfo(fullName);
		Console.WriteLine(fileInfo.Name);
		string pre = "    =>";
		bool retry = false;
		try
		{
			Console.WriteLine(pre + "Length:" + fileInfo.Length);
			Console.WriteLine(pre + "未报错,正常获取");
		}
		catch (FileNotFoundException)
		{
			fullName = @"\\?\" + fullName;
			retry = true;
			Console.WriteLine(pre + "文件不存在,添加长路经前缀后重试");
		}
		if (retry)
		{
			fileInfo = new FileInfo(fullName);
			try
			{
				Console.WriteLine(pre + "Length:" + fileInfo.Length);
				Console.WriteLine(pre + "重试后,正常获取");
			}
			catch (Exception ex)
			{
				Console.WriteLine(pre + "重试仍然报错");
				Console.WriteLine(ex.Message);
			}
		}
	}
}

运行结果

解决办法

先是考虑了捕获异常再重试的思路,但是在可预知的情况不应该使用trycatch方式处理问题。
所以采用了判断文件是否存在的方式

代码如下

static void Test03()
{
	List<string> dirList = new List<string>()
	{
		"F:\\100-cnblogs_blog",
		"01-all-备份备份备份备份备份备份备份",
		"02-html-备份备份备份备份备份备份备份",
		"03-bak-备份备份备份备份备份备份备份",
		"04-file-备份备份备份备份备份备份备份",
	};
	string basePath = Path.Combine(dirList.ToArray());
	if (Directory.Exists(basePath) == false)
		Directory.CreateDirectory(basePath);
	var files = Directory.GetFiles(basePath, "*.*", SearchOption.AllDirectories);
	foreach (var item in files)
	{
		string fullName = item;
		if (File.Exists(fullName) == false)
			fullName = @"\\?\" + fullName;
		FileInfo fileInfo = new FileInfo(fullName);
		Console.WriteLine(fileInfo.Name);
		string pre = "    =>";
		Console.WriteLine(pre + "Length:" + fileInfo.Length);
	}
}

运行结果

posted @ 2025-01-01 12:32  我有我奥妙  阅读(109)  评论(0)    收藏  举报