分享一个旧代码,这个代码是我曾经使用的,用来拷贝图片,很简单!其中的写法与我的一个程序有关,在这里,我来重温一下写法,并分享一下思路,供朋友们借鉴,并请各位高手提出宝贵意见。
当时的代码:
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;
这个是在我程序界面显示完成并统计图片数量的。
条友们,你明白了吗?
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved