我正在创建一个重载方法,它接受一个文件流作为参数而不是字符串,我想确保我以正确的方式做到这一点,特别是我不熟悉文件流。
原始方法:
public bool DownloadFile(string getFile, string downloadToPath)
{
if (File.Exists(downloadToPath))
File.Delete(downloadToPath);
//we are not downloading collections, so return false
if (_resource.IsCollection(fileToRetrieve))
return false;
_resource.Download(getFile, downloadToPath);
return File.Exists(downloadToPath);
}
重载方法:
public bool DownloadFile(string getFile, string downloadToPath)
{
using (FileStream file = new FileStream(getFile, FileMode.Open, FileAccess.Read))
{
string filePath = file.Name;
string filePathName = Path.GetFileName(filePath);
byte[] bytes = new byte[file.Length];
int numBytesToRead = (int)file.Length;
int numBytesRead = 0;
while (numBytesToRead > 0)
{
//If file exists, the read will return anything from 0 to numBytesToRead
int fileBytes = file.Read(bytes, numBytesRead, numBytesToRead);
//Break when the end of the file has been reached
if (fileBytes == 0)
break;
numBytesRead += fileBytes;
numBytesToRead -= fileBytes;
}
numBytesToRead = bytes.Length;
//Write the byte array to the new file stream
using (FileStream localPathStream = new FileStream(downloadToPath, FileMode.Create, FileAccess.Write))
{
localPathStream.Write(bytes, 0, numBytesToRead);
}
}
return false;
}
答案 0 :(得分:0)
它可能适用于您的情况,但请您注意事实 by definnition 流,因此FileStream
也可能不是磁盘上的文件,而是某些流数据,或者一些不确定的数据流(例如推文......)。
通过离开fileName
paameter,您可以在方法中显示您的expaction以详细说明文件。
所以我建议不要像这样添加重载。
答案 1 :(得分:0)
使用Stream.CopyTo
可以简化您的方法。您的方法将首先将所有字节读入内存,这对于大文件是不合需要的。
File.OpenRead
类似于FileMode.Read
和FileAccess.Read
标记。
File.OpenWrite
类似于FileMode.OpenOrCreate
和FileAccess.Write
。
public bool DownloadFile(string getFile, string downloadToPath)
{
if(string.IsNullOrWhiteSpace(getFile) || string.IsNullOrWhiteSpace(downloadToPath)) return false;
try
{
using(var readStream = File.OpenRead(getFile))
using(var writeStream = File.OpenWrite(downloadToPath))
{
readStream.CopyTo(writeStream, 1024);
}
}
catch(Exception e)
{
// log exception or rethrow
return false;
}
return true;
}