在C#中创建一个没有文件的文件流

4

是否可以创建一个没有实际文件的文件流?

让我来解释一下:

我知道如何从实际文件中创建流:

FileStream s = new FileStream("FilePath", FileMode.Open, FileAccess.Read);

但我能否用假文件创建一个FileStream呢?

意思是:
定义文件对象的属性,例如名称、类型、大小或其他必要属性,但不包含实际内容,
然后从这个“文件”创建一个FileStream?能否得到与上面代码类似的结果?

编辑:
我正在使用一个带有该代码的API示例。

        FileStream s = new FileStream("FilePath", FileMode.Open, FileAccess.Read);
        try
        {
            SolFS.SolFSStream stream = new SolFS.SolFSStream(Storage, FullName, true, false, true, true, true, "pswd", SolFS.SolFSEncryption.ecAES256_SHA256, 0);
            try
            {
                byte[] buffer = new byte[1024*1024];
                long ToRead = 0;
                while (s.Position < s.Length)
                {
                    if (s.Length - s.Position < 1024*1024)
                        ToRead = s.Length - s.Position;
                    else
                        ToRead = 1024 * 1024;
                    s.Read(buffer, 0, (int) ToRead);
                    stream.Write(buffer, 0, (int) ToRead);
                }  

因此,它基本上将文件流“s”写入某个地方。
我不想取一个现有的文件并将其写入,而是想要“创建”一个不带内容(我不需要内容)但具有真实文件的属性,如大小、名称、类型的不同文件。


2
你接下来想用这个流做什么?(大多数流没有“名称”等属性。)MemoryStream 可能 对你来说已经足够好了,但我们不知道你想要实现什么目标。 - Jon Skeet
1
你的意思是什么?新的FileStream并不要求文件实际上已经存在,所以你完全可以使用它来创建一个文件。只需要使用类似于 FileMode.Create 的东西就好了。 - Tobberoth
1
一个 FileStream 是一个 Stream。不需要进行任何转换。此外,当你拥有一个 FileStream 时,你自动拥有一个文件,因为 FileStream 就像是文件的面向对象表示。没有没有文件的 FileStream,尽管有一些不由文件支持但行为基本相同的不同流类型。 - O. R. Mapper
提供一些关于为什么您认为需要创建这个障碍的线索,以便您可以在之后绊倒在它上面,这将是很好的。 - Tony Hopkinson
1
你的问题有点令人困惑 - 如果你想要一个空文件(即实际上没有内容的文件 - 大小=0),为什么不只是创建一个没有内容的文件呢?请参见这个问题。之后你可以稍后再写入它。 如果你需要一个在系统中不可见的文件,为什么首先需要一个FileStream呢? - w128
显示剩余3条评论
1个回答

1
显然,您想要一个FileStream(明确指定其FileStream特定属性,如Name),但它并不指向文件。
据我所知,这在FileStream的实现中是不可能的。
但是,创建一个具有所需属性的包装类将是一个简单的解决方案:
  • 您可以在包装器中存储所有所需的属性。
  • 该包装器可以包装任意Stream,因此您可以自由选择FileStreamMemoryStream或任何其他流类型。
下面是一个示例:
public class StreamContainer
{
    public StreamContainer(string name, Stream contents)
    {
        if (name == null) {
            throw new ArgumentNullException("name");
        }
        if (contents == null) {
            throw new ArgumentNullException("contents");
        }

        this.name = name;
        this.contents = contents;
    }

    private readonly string name;

    public string Name {
        get {
            return name;
        }
    }

    private readonly Stream contents;

    public Stream Contents {
        get {
            return contents;
        }
    }
}

当然,您可以为各种流类型添加一些礼貌的创建方法(作为上述类中的静态方法):
public static StreamContainer CreateForFile(string path)
{
    return new StreamContainer(path, new FileStream(path, FileMode.Open, FileAccess.Read));
}

public static StreamContainer CreateWithoutFile(string name)
{
    return new StreamContainer(name, new MemoryStream());
}

在您的应用程序中,无论何时想要使用这样一个命名流,请传递 StreamContainer 而不是直接期望一个 Stream


1
我使用了一个Dictionary<string,Stream>。 - giammin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接