【问题标题】:Why am I not getting any data with this FileStream为什么我没有使用此 FileStream 获得任何数据
【发布时间】:2016-03-03 22:14:05
【问题描述】:

我是一名初级程序员,试图从 API 获取 mp4 视频并将它们保存到网络上的文件夹中。我正在使用以下代码;

public static void saveVideos(HttpContent content, String filename, bool overwrite)
    {
        string pathName = Path.GetFullPath(filename);
        using (FileStream fs = new FileStream(pathName, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            if (fs.CanWrite)
            {
                byte[] buffer = Encoding.UTF8.GetBytes(content.ToString());
                fs.Write(buffer, 0, buffer.Length);
                fs.Flush();
                fs.Close();

            }
        }
    }

代码编译不会出错,但所有视频都会写入大小为 1KB 的文件夹。我似乎无法弄清楚为什么我没有得到所有文件。

当我检查内容的价值时,我看到的数据如下所示:

Headers = {Content-Length: 240634544
Content-Disposition: attachment; filename=Orders.dat
Content-Type: application/x-www-form-urlencoded; charset=utf-8

谁能在这里指出我的错误?

谢谢

【问题讨论】:

  • HttpContent.ToString() 不返回其内容。您可以使用CopyToAsyncReadAsStreamAsyncReadAsStringAsync 方法。文档在这里:msdn.microsoft.com/en-us/library/…
  • if (fs.CanWrite) 完全没用。您打开它进行写入,很明显它CanWriteFlush()Close() 也无用...您正在使用using 模式,因此您不必手动Flush() 和@987654333 @
  • @DatVM 作为字符串读取在这里没有意义,因为他正在下载一个二进制文件的视频文件。使用ReadAsByteArrayAsync(或您提到的CopyToAsync)是可行的方法。
  • @PhilK 是的,你说得对,我忘了。

标签: c# filestream


【解决方案1】:

这并不像你认为的那样:

content.ToString()

除非另有覆盖,.ToString() 的默认实现只是打印类的名称。因此,您所保存的只是一堆带有类名的文件。

可能寻找的是the .ReadAsStringAsync() method。或者,因为无论如何您都将其转换为字节,.ReadAsByteArrayAsync() would also work。也许是这样的:

byte[] buffer = await content.ReadAsByteArrayAsync();

当然,既然这使用了await,那么你的方法就必须是async

public static async Task saveVideos(HttpContent content, String filename, bool overwrite)

如果您无法使用asyncawait(如果您使用的是较旧的 .NET 版本),那么请使用there are other ways to handle it as well


编辑:根据 cmets 和问题的一些上下文,您可能在这里处理大文件。在这种情况下,使用streams 会执行得更好。我目前没有任何示例代码,但基本上您想要做的是将数据直接从一个流移动到另一个流,而不是将其存储在内存变量中。

【讨论】:

  • 谢谢@David 我已经根据我已更改为内容编码的 cmets。 ReadAsByteArrayAsync 并且它正在工作。在较大的文件上速度非常慢。我尝试了您的建议,即在 await 命令中使用异步方法,但收到一条错误消息,指出无法等待字节 []。
  • @Perry:如果它将整个文件读入内存,那么它可能会很慢,是的。在这种情况下,您可以尝试使用流来代替:msdn.microsoft.com/en-us/library/hh138076.aspx 这可能需要一些修改,但是您应该能够直接在两个打开的流之间移动字节(一个来自 HTTP 响应,一个来自打开的文件正在写入)而不将其保存在内存中,这将是理想的。至于错误,我怀疑您可能没有正确使用await。你应该在等待任务,而不是任务的结果。
【解决方案2】:

如果其他人遇到问题或学习如何使用 FileStream 保存文件,请听到我用来解决问题的代码。

public static void saveVideos(HttpContent content, String filename, bool overwrite)
    {
        string pathName = Path.GetFullPath(filename);
        using (Stream fs = new FileStream(pathName, FileMode.Create, FileAccess.Write, FileShare.None, 4096, FileOptions.None))
        {
               byte[] buffer = content.ReadAsByteArrayAsync().Result;
               fs.Write(buffer, 0, buffer.Length);
        }
    }

【讨论】:

    猜你喜欢
    • 2019-08-13
    • 2022-01-11
    • 2012-05-20
    • 2015-10-25
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    相关资源
    最近更新 更多