C#File.Open和Stream等价物

时间:2009-05-15 19:59:40

标签: c# file-io stream

此Web服务需要此xml文件:

request.FeedContent = File.Open("test.xml", FileMode.Open, FileAccess.Read);

我已将该文件放在流中,但此语句会挂起:

stream.Position = 0;
request.FeedContent = stream;

流是标准的.net MemoryStream

我在流上做什么操作使其与File.Open相同?

谢谢!

检查一下(api定义):

    /// <summary>
    /// Gets and sets the FeedContent property.
    /// </summary>
    //[XmlElementAttribute(ElementName = "FeedContent")]
    public Stream FeedContent
    {
        get { return this.feedContentField ; }
        set { this.feedContentField= value; }
    }

5 个答案:

答案 0 :(得分:4)

我怀疑网络服务确实需要一个流。它到底怎么代表那个?你确定它不只是期望内容作为字节数组吗?

File.Open只返回FileStream - 如果stream已经是FileStream,则两者之间没有区别。它只是可能它需要一个FileStream,而你只有一个Stream。如果是这种情况,并且文件中的不是,您可能必须将其写入文件并打开FileStream。然后向网络服务开发者抱怨他们的API很奇怪。

编辑:如果它只期待Stream,你应该没问题。你说它挂了 - 你试过调试并看到它挂在哪里?它是否因某种原因试图读取更多数据?

答案 1 :(得分:1)

您确定流中的当前位置是否正确?

从文件流移动到内存流时,我做的最常见的错误是在写入内存流之后错过了我的结尾:

stream.Seek(0, SeekOrigin.Begin);

答案 2 :(得分:1)

在分配之前,您是否尝试将文件内容放入内存流?也许该服务正在使用您的文件流不支持的一些流功能。

这样的事情:

var stream = new MemoryStream(File.ReadAllBytes(fileName));
request.FeedContent = stream;

修改

等等......我完全误解了你的问题。那么你直接传递FileStream的版本是否有效,如果你提供的MemoryStream具有相同的内容,它不会?

现在我建议您将内存流的内容与文件流的内容进行完全比较。也许是不同的编码?

答案 3 :(得分:0)

File.Open返回一个流。还有其他问题。

答案 4 :(得分:0)

File.Open返回一个打开并位于流开头的FileStream。

您发布的代码:

request.FeedContent = stream;

不表示您要分配给FeedContent的流的状态。例如。也许你没有位于文件的开头? (如果流支持搜索,请使用Stream.Seek,如果它是FileStream或MemoryStream,则使用它。)

如果没有帮助,请发布更多代码。