代码之家  ›  专栏  ›  技术社区  ›  Perry

为什么我无法使用此FileStream获取任何数据

  •  0
  • Perry  · 技术社区  · 9 年前

    我是一名Jr.程序员,试图从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
    

    有人能指出我的错误吗?

    谢谢

    2 回复  |  直到 9 年前
        1
  •  4
  •   Community CDub    7 年前

    这并不像你认为的那样:

    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)
    

    如果你不能利用 异步 等候 (如果您使用的是较旧的.NET版本),那么 there are other ways to handle it as well .


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

        2
  •  0
  •   Perry    9 年前

    如果其他人有问题或学习如何使用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);
            }
        }