优秀的编程知识分享平台

网站首页 > 技术文章 正文

实战教程:基于C#的文件遍历与图片拷贝代码全解析

nanyue 2024-10-01 13:14:20 技术文章 8 ℃

分享一个旧代码,这个代码是我曾经使用的,用来拷贝图片,很简单!其中的写法与我的一个程序有关,在这里,我来重温一下写法,并分享一下思路,供朋友们借鉴,并请各位高手提出宝贵意见。

当时的代码:

        private void copyimg_Click(object sender, EventArgs e)
        {
            int n = 0;
            string 源照片 = @"H:\0000\cs\";
            string 照片库 = @"H:\0000\0000\照片库\";
            string 保存位置 = download_Path;
            var files = Directory.EnumerateFiles(源照片, "*.jpg", SearchOption.TopDirectoryOnly);
            foreach (var f in files)
            {
                FileInfo fileInfo = new FileInfo(f);
                var fs = Directory.EnumerateFiles(照片库, "*.jpg", SearchOption.AllDirectories);
                foreach (var item in fs)
                {
                    FileInfo 库file = new FileInfo(item);
                    if (库file.Name == fileInfo.Name)
                    {
                        File.Copy(库file.FullName, 保存位置 + "/okimg/" + 库file.Name, true);
                        Thread.Sleep(50);
                        Application.DoEvents();
                        n += 1;
                        File.AppendAllText(保存位置 + "/存在.txt", n + "|" + fileInfo.Name + Environment.NewLine);
                    }
                }
            }
            richTextBox1.Text = "完成" + n;
        }

其中:

public static string download_Path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;//获取当前文件所在路径

string 指定文件路径 = download_Path + "照片下载信息";

首先,这个“指定文件路径”为什么这么写呢?原因是download_Path是获取的当前文件路径,方便程序编译成软件后路径错误,而且,这个写法是为了复用,所以采用了这个写法。

现在我来分解下上面的代码:

 private void copyimg_Click(object sender, EventArgs e)

这个是我界面的一个按钮,当点击时触发。

           int n = 0;
           string 源照片 = @"H:\0000\cs\";
           string 照片库 = @"H:\0000\0000\照片库\";
           string 保存位置 = download_Path;

这个很好理解了,定义一个计数器的起始和源照片及保存位置。

var files = Directory.EnumerateFiles(源照片, "*.jpg", SearchOption.TopDirectoryOnly);

这个使用EnumerateFiles遍历源目录下的所有jpg图片文件,参数设为TopDirectoryOnly表示仅查找顶级目录下的图片文件。这个根据自己的情况可改为查找包括子目录即可。

接着就是处理这个IEnumerable了,我采用了foreach循环遍历,这个没有使用更好的写法是因为我的图片文件不是很多,采用异步和多线程和这个差不多,可能还没这个块。

如果图片特别多还还是建议采用异步和多线程,原因是,异步和多线程在分配资源是也会占用CPU时间的,所以在少量图片时效率反而可能不如foreach,如果不知道哪个更好,可以测试一下。

但无论如何,在大量图片时不建议foreach,因为这个还会占用大量CPU,很可能会导致界面卡死,个人意见,仅供参考。

File.Copy(库file.FullName, 保存位置 + "/okimg/" + 库file.Name, true);

这个是拷贝的主命令,还有别的写法,不多数,自行查看资料。

                        Thread.Sleep(50);
                        Application.DoEvents();

这个写法主要是防止界面卡死的,其实这个写法是不建议的,这样写,可以防止界面卡斯但速度会慢很多,这样就把前面提高速度的写法优势消除了,这里,我不建议使用,至于少量图片不追求速度的可以使用,有时间我写一个测试代码,以比较两者的优劣供大家参考。

File.AppendAllText(保存位置 + "/存在.txt", n + "|" + fileInfo.Name + Environment.NewLine);

这个代码是采用追加的写法把已拷贝的图片名写入一个文件中,方便查看和验证结果。并每个图片后面用EnvironmentNewLine进行换行。

richTextBox1.Text = "完成" + n;
这个是在我程序界面显示完成并统计图片数量的。

条友们,你明白了吗?

最近发表
标签列表