Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我不能用这个文件流获取任何数据_C#_Filestream - Fatal编程技术网

C# 为什么我不能用这个文件流获取任何数据

C# 为什么我不能用这个文件流获取任何数据,c#,filestream,C#,Filestream,我是一名Jr程序员,试图从API获取mp4视频并将其保存到网络上的文件夹中。我正在使用以下代码 public static void saveVideos(HttpContent content, String filename, bool overwrite) { string pathName = Path.GetFullPath(filename); using (FileStream fs = new FileStream(pathName, Fi

我是一名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
byte[] buffer = await content.ReadAsByteArrayAsync();
有人能指出我的错误吗


谢谢

这并不像你想象的那样:

content.ToString()
除非另有重写,否则
.ToString()
的默认实现只打印类的名称。所以你要保存的只是一堆文件,里面有类名

你可能要找的是。或者,由于您正在将其转换为字节。也许是这样的:

Headers = {Content-Length: 240634544
Content-Disposition: attachment; filename=Orders.dat
Content-Type: application/x-www-form-urlencoded; charset=utf-8
byte[] buffer = await content.ReadAsByteArrayAsync();
当然,因为这使用了
wait
,所以您的方法必须是
async

public static async Task saveVideos(HttpContent content, String filename, bool overwrite)
如果您不能使用
async
wait
(如果您使用的是较旧的.NET版本),那么



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

这并不像您认为的那样:

content.ToString()
除非另有重写,否则
.ToString()
的默认实现只打印类的名称。所以你要保存的只是一堆文件,里面有类名

你可能要找的是。或者,由于您正在将其转换为字节。也许是这样的:

Headers = {Content-Length: 240634544
Content-Disposition: attachment; filename=Orders.dat
Content-Type: application/x-www-form-urlencoded; charset=utf-8
byte[] buffer = await content.ReadAsByteArrayAsync();
当然,因为这使用了
wait
,所以您的方法必须是
async

public static async Task saveVideos(HttpContent content, String filename, bool overwrite)
如果您不能使用
async
wait
(如果您使用的是较旧的.NET版本),那么



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

如果其他人遇到问题或学习如何使用FileStream保存文件,我将使用hear代码来解决此问题

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

如果其他人遇到问题或正在学习如何使用FileStream保存文件,我将使用hear代码来解决此问题

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

HttpContent.ToString()
不返回其内容。您可以使用
CopyToAsync
ReadAsStreamAsync
ReadAsStringAsync
方法。文档就在这里:if(fs.CanWrite)是完全无用的。你打开它是为了写,所以很明显它
CanWrite
Flush()
Close()
也没用了。。。您使用的是
using
模式,这样您就不必手动
刷新()
关闭()
@DatVM读取字符串,因为他正在下载一个二进制文件的视频文件。使用
ReadAsByteArrayAsync
(或您提到的
CopyToAsync
)是一种方法。@PhilK是的,您是对的,我忘记了。
HttpContent.ToString()
不返回其内容。您可以使用
CopyToAsync
ReadAsStreamAsync
ReadAsStringAsync
方法。文档就在这里:if(fs.CanWrite)是完全无用的。你打开它是为了写,所以很明显它
CanWrite
Flush()
Close()
也没用了。。。您使用的是
using
模式,这样您就不必手动
刷新()
关闭()
@DatVM读取字符串,因为他正在下载一个二进制文件的视频文件。使用
ReadAsByteArrayAsync
(或者你提到的
CopyToAsync
)是一种方法。@PhilK是的,你说得对,我忘记了。谢谢@David,我根据我的评论将代码改为内容。读取AsByteArrayaSync,它正在工作。在较大的文件上速度非常慢。我尝试了你的建议,在await命令中使用异步方法,但出现了一个错误,指出不能等待一个字节[]。@Perry:如果它正在将整个文件读入内存,那么它可能会非常慢,是的。在这种情况下,您可以尝试改用流:这可能需要一点修改,但这样您就可以在两个打开的流(一个来自HTTP响应,一个来自正在编写的打开文件)之间直接移动字节,而无需将其保存在内存中,这将是理想的。至于错误,我怀疑您可能没有正确使用
wait
。你应该在等待任务,而不是任务的结果。谢谢@David,我已经根据我的评论将代码改为内容。读取AsByteArrayaSync,它正在工作。在较大的文件上速度非常慢。我尝试了你的建议,在await命令中使用异步方法,但出现了一个错误,指出不能等待一个字节[]。@Perry:如果它正在将整个文件读入内存,那么它可能会非常慢,是的。在这种情况下,您可以尝试改用流:这可能需要一点修改,但这样您就可以在两个打开的流(一个来自HTTP响应,一个来自正在编写的打开文件)之间直接移动字节,而无需将其保存在内存中,这将是理想的。至于错误,我怀疑您可能没有正确使用
wait
。你应该等待任务,而不是任务的结果。