0

我正在创建一个接受文件流作为参数而不是字符串的重载方法,并且我想确保我以正确的方式特别是我对文件流不太熟悉。

原始方法:

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;
    }
4

2 回答 2

0

它可能适用于您的情况,但请注意,通过定义流,FileStream也可以不是磁盘上的文件,而是一些流数据或一些无限的数据流(例如推文......)。

通过使用参数离开fileName,您可以在方法中显示您的扩展以使用文件进行详细说明。

所以我建议不要像这样添加重载。

于 2013-07-23T13:38:30.920 回答
0

您的方法可以使用Stream.CopyTo. 您的方法将首先将所有字节读入内存,这对于大文件来说是不可取的。

File.OpenRead类似于FileMode.ReadFileAccess.Read标志。

File.OpenWrite类似于FileMode.OpenOrCreateFileAccess.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;
}
于 2013-07-23T14:26:36.597 回答