附加到文本文件(不覆盖!)

Posted

技术标签:

【中文标题】附加到文本文件(不覆盖!)【英文标题】:Append to a Text File (Not Overwrite!) 【发布时间】:2016-04-04 23:43:09 【问题描述】:

我的另一个通用平台应用问题,还在学习中!

快速问题 - 我需要使用哪种方法将数据写入文本文件以将字符串附加(而不是覆盖)到文本文件?目前我正在使用流使用异步 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;
            
        

谢谢。

【问题讨论】:

stream.GetOutputStreamAt(0) 是文件的开头,这就是您覆盖整个内容的原因。您需要获取文件的长度并从那里开始而不是 0。 感谢 Paul,但是当我第一次尝试将字符串写入文件时,除非它是 0,否则它会在开头切断我的一些字符串。字符串的长度也不同......还有其他附加方式吗? 【参考方案1】:

我面前没有我现在可以测试的平台,但这应该可以获取现有文件的长度并将编写器放在最后(新文件应该返回 0):

using (var outputStream = stream.GetOutputStreamAt(stream.Size))

【讨论】:

刚刚在一个将数据记录到文件的 UWP 应用程序中尝试了这个,它可以工作,简单的解决方案,谢谢!【参考方案2】:

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

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

【讨论】:

谢谢,我该如何将这段代码放入我的程序中?对不起,我有点新手! 如果您自己尝试过,最好的方法是运行和调试您的程序,看看您会得到什么。作为新手,您正在使用流和 using 语句,但您不知道如何/在哪里放置上述行? 是的,我试过了。我已经将await FileIO.AppendTextAsync(ticketsFile, "Submitted: " (etc) 放在using (var dataWriter = new Windows.Storage.Streams.DataWriter(outputStream)) 中,但它给了我错误访问被拒绝。我一定是做错了什么。 @JasonBrown 绝对是你做错了——你遇到了异常,因为你第二次尝试打开文件——首先是当你打开流时,其次是 FileIO方法。删除所有 using 语句和打开流的行,将答案中的行放在您的问题中 //Use stream to write to the file 行的上方。 所以写代码是/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); await FileIO.AppendTextAsync(ticketsFile, "Submitted: " + submitDate + "\n" + "Problem: " + problem + "\n" + "Room: " + location + "\n" + "Description: ?阅读代码需要进行任何更改吗?那是显示错误。谢谢。

以上是关于附加到文本文件(不覆盖!)的主要内容,如果未能解决你的问题,请参考以下文章

在Python中将文本附加到文件[重复]

如何从SharedPreferences文件中正确地将文本附加到TextView而不是覆盖它?

文件编写器覆盖文件而不是附加到末尾的问题

将文本附加到文本文件而不替换它Python [重复]

PHP将文件文本附加到所有javaScript文件

如何将输出附加到文本文件的末尾