我在使用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]);
}
}
但我不知道如何打开这个文件。
答案 0 :(得分:1)
您希望内存中包含文件名和数据的文件系统。所以使用这样的东西:
public class MyFolder
{
string folderName { get; set;}
List<MyFolder> childFolders { get; set; }
Dictionary<string, List<byte>> files { get; set; }
}
答案 1 :(得分:0)
好的,我看到的唯一解决方案就是黑客攻击:
Process.Start
; File.Delete
删除文件。代码:
// 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()));
}
}