首页 > 编程语言 >【长路经】C#读取文件抛出FileNotFoundException异常

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

时间:2025-01-01 12:41:26浏览次数:1  
标签:路经 pre Console FileNotFoundException C# 备份 WriteLine fullName fileInfo

前言

在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);
            }
        }

运行结果

 

 


 

标签:路经,pre,Console,FileNotFoundException,C#,备份,WriteLine,fullName,fileInfo
From: https://www.cnblogs.com/masonblog/p/18645457

相关文章

  • VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS Huawei (华为) 定制版
    VMwareESXi8.0U3cmacOSUnlocker&OEMBIOSHuawei(华为)定制版ESXi8.0U3c标准版,Dell(戴尔)、HPE(慧与)、Lenovo(联想)、Inspur(浪潮)、Cisco(思科)、Hitachi(日立)、Fujitsu(富士通)、NEC(日电)、Huawei(华为)、xFusion(超聚变)OEM定制版请访问原文......
  • VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动
    VMwareESXi8.0U3cmacOSUnlocker&OEMBIOS集成网卡驱动和NVMe驱动(集成驱动版)发布ESXi8.0U3c集成驱动版,在个人电脑上运行企业级工作负载请访问原文链接:https://sysin.org/blog/vmware-esxi-8-u3-sysin/查看最新版。原创作品,转载请保留出处。发布ESXi8.0......
  • 计算机网络•自顶向下方法:DHCP、NAT、IPV6
    获取IP地址路由器:管理员手工配置路由器各个接口的IP地址主机:管理员手工配置主机IP地址,服务器通常采用这种方法使用动态主机配置协议DHCP(DynamicHostConfigurationProtocol)获取IP地址、子网掩码、缺省路由器、本地DNS服务器等配置信息,个人终端通常采用这种方法使用DH......
  • 【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合
    目录......
  • springboot527基于Java企业项目管理系统(论文+源码)_kaic
    摘 要如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统企业项目管理系统信息管理难度大,容错率低,管理人员处理数据费工费时,所以专门为解决这个难题开发了一个企业项......
  • springboot526基于Java的大学生考勤系统的设计与实现(论文+源码)_kaic
    摘  要信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理......
  • 西门子SCL实现数码循环切换
    应用的软件是西门子的博图V18,功能实现是按下启动按钮每隔两秒切换一次数字,从0~9一直循环,按下停止按钮停止循序。比起梯形图,SCL更像是单片机的编程思路,需要哪一个口亮就直接至高或是至低。用Q0.0~Q0.6分别表示字段a、b、c、d、e、f、g。代码实现"启动保持信号":=("启动按钮"......
  • Java,Future,Callable和Executor
    系列文章目录Java中Future,Callable和Executor学习入门使用文章目录系列文章目录前言一、Future,Callable和Executor是什么?二、使用示例1.编写获取数组最大值方法2.使用Executor和future总结前言如果需要多线程执行某个任务,又希望分给线程的任务能够按照自己指......
  • R语言ggplot2可视化实战:分面图(faceting)使用label_wrap_gen函数设置每个分面图的子图标
    R语言ggplot2可视化实战:分面图(faceting)使用label_wrap_gen函数设置每个分面图的子图标题自动换行为多行文本(基于设定的当行宽度进行标题文本自动换行)目录ggplot2可视化分面图(faceting)使用label_wrap_gen函数设置每个分面图的子图标题自动换行为多行文本(基于设定的当行宽度进......
  • 对准确度(accuracy)、精确率(precision)、召回率(recall)、F1值文章的总结
    前言准确度、精确率、召回率、F1值作为评估指标,经常用到分类效果的评测上。比较好理解的二分类问题,准确度评估预测正确的比例,精确率评估预测正例的查准率,召回率评估真实正例的查全率。如何把这些评估指标用到多分类上呢,比如有三个类别A、B、C,准确度好理解,只要关系是否预测正确即......