使用filestream创建方法重载

时间:2013-07-23 13:34:33

标签: c# asp.net-mvc

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

原始方法:

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

2 个答案:

答案 0 :(得分:0)

它可能适用于您的情况,但请您注意事实 by definnition 流,因此FileStream也可能不是磁盘上的文件,而是某些流数据,或者一些不确定的数据流(例如推文......)。

通过离开fileName paameter,您可以在方法中显示您的expaction以详细说明文件。

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

答案 1 :(得分: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;
}