之前在编写在控制台Fanuc程序传输时发现一个问题,当我用Python调用接口进行文件传输时,总是不知道文件读取了多少,还要多久才能读取完成,搞的一开始总以为程序挂了,为了方便查看传输进度,今天我们做个文件读写进度条,下面是动态演示图:
首先我们定义个源文件路径,并获取到文件名,然后制定一个存储路径并获取路径中的文件名,将其与提取的文件名进行比对,如果已存在我们就将其删除掉。
string filepath = @"E:\Adobe Photoshop CS6.zip";
string filename = Path.GetFileName(filepath);
string saveDir = @"E:\UG";
string savePath = saveDir +"\\"+ filename;
DirectoryInfo sp = new DirectoryInfo(saveDir);
FileSystemInfo[] fi = sp.GetFileSystemInfos();
foreach (FileSystemInfo i in fi)
{
if (i.Name == filename)
{
i.Delete();
}
}
下面我们开始定义读写文件流,并获取文件的大小,下面我们定义几个变量来记录每次读取的位置和读取的长度,以及剩余的读取大小等。
FileStream fs = new FileStream(filepath, FileMode.OpenOrCreate,FileAccess.Read);
FileStream wr = new FileStream(savePath,FileMode.OpenOrCreate,FileAccess.Write);
long count = fs.Length;//文件长度
int start = 0;//开始读取
int num = 0; //每次读取的长度
long end = count;//剩余读取长度
double prePercent = 0;//进度条
现在我们来绘制进度条背景,我们设置进度条 长度为50,颜色为绿色,直接打印空格填充背景即可
ConsoleColor colorBack = Console.BackgroundColor;
ConsoleColor colorFore = Console.ForegroundColor;
if (count > 0)
{
//绘制读条背景界面
Console.WriteLine("********************* Loading *********************");
Console.BackgroundColor = ConsoleColor.DarkCyan;//设置背景色
for (int i = 0; ++i <= 50; )
{
Console.Write(" ");//打印空格
}
Console.WriteLine(" ");
Console.BackgroundColor = colorBack;//还原背景色
Console.WriteLine("0%");
Console.WriteLine("***************************************************");
}
接下来我们开始实现读写功能,获取文件的开始位置,判断下剩余文件大小,如果不足一个bytes空间,则num等于实际剩余空间大小,否则就以每个bytes大小传输,直到剩余大小为0结束,同时我们进行写入操作,将文件分段写入到指定文件目录中去。
while (end > 0)
{
fs.Position = start;
if (end < maxlength)
num = fs.Read(bytes, 0, Convert.ToInt32(end));//读取文件
else
num = fs.Read(bytes, 0, maxlength);//读取文件
wr.Write(bytes, 0, num);//写入文件
if (num == 0)
break;
start += num;
end -= num;
}
fs.Close();
wr.Close();
fs.Dispose();
Console.WriteLine(" Finished Reading !");
Console.ReadLine();
}
这是我们还看不到读写进度,因为我们还没有对每次读取的数据进行呈现,从上面的代码可以看出我们记录了每次传输的大小,已经传输了多少,还剩多少我们现在都知道了,接下来我们就利用已经传输的文件大小和总大小值进行计算,来获取我们每次传输的文件比例,并将其绘制成进度条显示出来。
double percent;
if (start <= count)
{
percent = (double)start / count;
percent = Math.Ceiling(percent * 100);
}else
{
percent = 1;
percent = Math.Ceiling(percent * 100);
}
for (int i = Convert.ToInt32(prePercent); i <= percent; i++)
{
//绘制进度条进度
Console.BackgroundColor = ConsoleColor.Yellow;//设置进度条颜色
Console.SetCursorPosition(i/2, 2);//设置光标位置,
Console.Write(" ");//移动进度条
Console.BackgroundColor = colorBack;//恢复输出颜色
//更新进度百分比,原理同上.
Console.ForegroundColor = ConsoleColor.Green;
Console.SetCursorPosition(0, 3);
Console.Write("{0}% ", i);
Console.ForegroundColor = colorFore;
}
prePercent = percent;
我们将传输的值进行计算,得到小数再将其乘上100换算成百分数并取整数Math.Ceiling(percent * 100),接下来就是更新进度条了,跟上面一样,我们定义背景色,光标移动随着我们的传输比例进行移动即可。
这里把源码奉上,感兴趣的可以试试: c#实现文件读写并显示读写进度