C# - 如何在内存中创建一个txt文件,然后以编程方式打开它?

时间:2017-05-31 21:43:33

标签: c# file

我在使用C#创建txt文件时遇到问题。我正在尝试在内存中创建此文件 (我不想在物理路径中创建它),然后使用defaul应用程序以编程方式打开此文件。 PC必须检测文件扩展名(在本例中为.txt)并选择正确的程序来显示文件(在这种情况下可能是Notepad,Word,Wordpad ......)。

我现在得到了这个:

using (var writer = new StreamWriter("file.txt"))
{
    writer.WriteLine(
        grr[0].Keys.ToArray()[0] + "," + grr[0].Keys.ToArray()[1] + "," +
        grr[0].Keys.ToArray()[2] + "," + grr[0].Keys.ToArray()[3]);

    for (int r = 0; r < row - 1; r++)
    {
        writer.WriteLine(
            grr[r].Values.ToArray()[0] + "," + grr[r].Values.ToArray()[1] + "," +
            grr[r].Values.ToArray()[2] + "," + grr[r].Values.ToArray()[3]);
    }
}

但我不知道如何打开这个文件。

2 个答案:

答案 0 :(得分:1)

您希望内存中包含文件名和数据的文件系统。所以使用这样的东西:

public class MyFolder
{
    string folderName { get; set;}
    List<MyFolder> childFolders { get; set; }
    Dictionary<string, List<byte>> files { get; set; }
}

答案 1 :(得分:0)

好的,我看到的唯一解决方案就是黑客攻击:

  1. 将数据写入文件;
  2. 使用Process.Start;
  3. 使用默认应用打开文件
  4. 使用File.Delete删除文件。
  5. 代码:

    // test data that I'll write on the file
    var text = Enumerable.Range(0, 1000000).Select(x => x.ToString()).ToArray();
    
    // choose the Desktop folder to verify that
    // the file is deleted at the end of the method
    var tempDir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
    
    // choose a random file name that will be unique 99.999999999% of the times
    var filePath = Path.Combine(tempDir, Guid.NewGuid().ToString() + ".txt");
    
    // write the file. Here I use WriteAllLines, you can use StreamWriter
    File.WriteAllLines(filePath, text);
    
    // start the default app for this path
    Process.Start(filePath);
    
    // wait to let the default app to open the file;
    // otherwise the app will crash, not finding the file anymore
    // just in the middle of the read
    // (I put 2 sec, but the time must be verified
    // depending on your system and the file size) 
    Thread.Sleep(2000);
    
    // this will totally delete the file
    File.Delete(filePath);
    

    如果您将记事本作为txt文件的默认应用程序,那么您将看到:记事本打开了您的数据,但该文件不再存在。那就是你想要的,不是吗?您也不会在回收站中找到该文件,因此您不会有磁盘空间泄漏。

    此技巧的唯一缺陷是:如果您在应用上单击“保存”,它将不会询问您要保存文件的路径。相反,它只是在删除之前重新创建文件,并将直接保存数据。那是因为它打开了一个物理文件,它没有创建一个新文件,所以它会记住filePath并将用它来保存。

    如果您没有找到更多正确/专业的解决方案,那么这个解决方案就可以完成它的工作。

    <强> ASIDE:

    我建议你稍微重构一下。

    第一步,避免重复

    using (var writer = new StreamWriter("file.txt"))
    {
        var array = grr[0].Keys.ToArray();
        writer.WriteLine(array[0] + "," + array[1] + "," + array[2] + "," + array[3]);
    
        for (int r = 0; r < row - 1; r++)
        {
            var grrr = grr[r].Values.ToArray();
            writer.WriteLine(grrr[0] + "," + grrr[1] + "," + grrr[2] + "," + grrr[3]);
        }
    }
    

    第二步,使用更高级的内置函数

    using (var writer = new StreamWriter("file.txt"))
    {
        writer.WriteLine(string.Join(",", grr[0].Keys.ToArray()));
    
        for (int r = 0; r < row - 1; r++)
        {
            writer.WriteLine(string.Join(",", grr[r].Values.ToArray()));
        }
    }