追加到文本文件中(而不是覆盖!)

4

我有一个与Universal Platform App相关的问题,正在学习中!

快速提问 - 写入数据到文本文件时,我需要使用哪种方法来追加(而不是覆盖)字符串到文本文件中?目前,我正在使用异步流式传输的void方法,但它正在覆盖我的文件。以下是创建和写入文本文件的不同方式:https://msdn.microsoft.com/en-us/library/windows/apps/mt185401.aspx

这是目前的代码。是否需要修改以将数据追加到文本文件而不是覆盖它,或者我需要使用其他方法来追加数据?

//WRITE
        //Create the text file to hold the data
        Windows.Storage.StorageFolder storageFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
        Windows.Storage.StorageFile ticketsFile = await storageFolder.CreateFileAsync("tickets.txt", Windows.Storage.CreationCollisionOption.OpenIfExists);

        //Use stream to write to the file
        var stream = await ticketsFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);

        using (var outputStream = stream.GetOutputStreamAt(0))
        {
            using (var dataWriter = new Windows.Storage.Streams.DataWriter(outputStream))
            {
                dataWriter.WriteString("Submitted: " + submitDate + "\n" + "Problem: " + problem + "\n" + "Room: " + location + "\n" + "Description: " + descriptionText.Text + "\n" + "Priority: " + priority + "\n");
                await dataWriter.StoreAsync();
                await outputStream.FlushAsync();
            }
        }
        stream.Dispose(); // Or use the stream variable (see previous code snippet) with a using statement as well.

如果有所不同的话,我的读取代码是:
//READ
        //Open the text file
        stream = await ticketsFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);
        ulong size = stream.Size;

        using (var inputStream = stream.GetInputStreamAt(0))
        {
            using (var dataReader = new Windows.Storage.Streams.DataReader(inputStream))
            {
                uint numBytesLoaded = await dataReader.LoadAsync((uint)size);
                string savedTickets = dataReader.ReadString(numBytesLoaded);

                textBox.Text = savedTickets;
            }
        }

谢谢。

1
stream.GetOutputStreamAt(0) 是你文件的开头,这就是为什么你会覆盖整个内容。你需要获取文件的长度并从那里开始,而不是从0开始。 - Paul Abbott
谢谢Paul,但是当我尝试第一次将字符串写入文件时,除非它是0,否则会在开头截断我的字符串的一部分。字符串的长度也不同...是否有其他追加的方法? - Jason Brown
2个回答

6

我现在没有一个可以测试的平台,但是这个方法应该可以获取已有文件的长度并将写入器放置在文件末尾(对于新文件,应该返回0):

使用 (var outputStream = stream.GetOutputStreamAt(stream.Size))


刚在一个记录数据到文件的UWP应用程序中尝试了这个方法,它很有效,感谢这个简单的解决方案! - sergeantKK

6

除了获取流之外,您还可以利用FileIO类。例如AppendTextAsync方法:

await FileIO.AppendTextAsync(ticketsFile, "Submitted: " + submitDate + "\n" + "Problem: " + problem + "\n" + "Room: " + location + "\n" + "Description: " + descriptionText.Text + "\n" + "Priority: " + priority + "\n");

谢谢,我应该如何将这段代码放入我的程序中?抱歉,我有点新手! - Jason Brown
1
如果你自己尝试过最好不过了 - 运行和调试你的程序,看看你得到了什么。作为一个初学者,你正在使用流和using语句,而你不知道在哪里放置上面的那行代码? - Romasz
是的,我已经尝试过了。我把这行代码 await FileIO.AppendTextAsync(ticketsFile, "Submitted: "(等等)放在 using (var dataWriter = new Windows.Storage.Streams.DataWriter(outputStream)) 里面,但它给出了“访问被拒绝”的错误。我一定做错了什么。 - Jason Brown
@JasonBrown 几乎在任何你打开文件流的地方,你都需要 using(stream = await ticketsFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite)) { } 语句 - 如果流没有被关闭/释放 - 当尝试再次读取/写入文件时,你很可能会遇到访问被拒绝的异常。 - Romasz
编辑:目前似乎可以工作,感谢@Romasz的帮助!如果我在这方面遇到其他问题,我会再次发布! - Jason Brown
显示剩余3条评论

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