Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 流不可写(StreamWriter)_C#_File_Windows Phone 8.1 - Fatal编程技术网

C# 流不可写(StreamWriter)

C# 流不可写(StreamWriter),c#,file,windows-phone-8.1,C#,File,Windows Phone 8.1,我正在尝试从IsolatedStorage上的文件中删除特定行,但仍从以下方法接收到“流不可写”: public async static void RemoveFavoriteFromFile(int id) { string favoriteFilename = Globals.FavoriteFilepath; StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder; var

我正在尝试从IsolatedStorage上的文件中删除特定行,但仍从以下方法接收到“流不可写”:

public async static void RemoveFavoriteFromFile(int id)
{
    string favoriteFilename = Globals.FavoriteFilepath;
    StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;
    var folder = await local.GetFolderAsync("DataFolder");
    var file = await folder.OpenStreamForReadAsync(Globals.FavoriteFilepath);
    using (StreamReader sr = new StreamReader(file))
    {                
        using (StreamWriter sw = new StreamWriter(file))
        {
            string line = null;
            while ((line = sr.ReadLine()) != null)
            {
                if (String.Compare(line, id.ToString()) == 0)
                    continue;
                sw.WriteLine(line);
            }
        }
    }
}
在线
使用(StreamWriter sw=新StreamWriter(文件))

有人能帮我吗

提前谢谢


编辑:我主要想请您建议我如何从现有文件中删除特定行,无论我已经创建了什么。对于我来说,理解的主要问题是,如何编写/编辑一个我首先需要阅读的文件以找到特定的行。

同时读取和写入同一个文件总是一个坏主意

写入交换文件“filename\u swap.txt”。在完成整个文件的编写之后,删除原始文件并将“filename_swap.txt”重命名为原始文件(基本上替换它)

也可以将整个文件读入缓冲区,然后关闭文件。对所述缓冲区进行更改,然后再次打开文件进行写入。这一次,写入修改的缓冲区的全部内容


因此,让我们模块化您的程序

using System.Threading.Tasks;

// read the specific file into a string buffer
private async Task<string> ReadFileIntoBuffer(string fileName)
{
    string buffer = "";                                                                  // our buffer

    StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;           // local folder
    var folder = await local.GetFolderAsync("DataFolder");                               // sub folder

    // open the file for reading                        
    using (Stream s = await folder.OpenStreamForReadAsync(fileName))
    {
        using (StreamReader sr = new StreamReader(s))
        {
            buffer = await sr.ReadToEndAsync();
        }
    }

    // return the buffer
    return buffer;
}

// write the string buffer to a specific file
private async Task<bool> WriteBufferToFile(string fileName, string buffer)
{
    try
    {

        StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;           // local folder
        var folder = await local.GetFolderAsync("DataFolder");                               // sub folder

        // open the file for writing
        using (Stream s = await folder.OpenStreamForWriteAsync(fileName, CreationCollisionOption.ReplaceExisting))
        {
            using (StreamWriter sw = new StreamWriter(s))
            {
                await sw.WriteAsync(buffer);
            }
        }
    }
    catch (Exception ex)
    {
        string error_message = ex.Message;
        return false;
    }

    return true;
}


如果您在理解问题时遇到困难,通常最好将问题分解成更小的部分并从中进行调试。

您不能同时从/向文本流进行读写,文件内容将混乱不堪。名称“OpenStreamForReadAsync”应该将该点带回家,该流只可读。不要试图找到一个“OpenStreamForReadWriteAsync”方法,它不存在。“为什么当我以只读方式打开流时,我不能向它写入”并不是一个真正可以接受的问题。请澄清您需要了解该错误消息的其他信息。如果您正在寻求帮助删除行-请更新您的问题,以便清楚您需要什么帮助以及您尝试了什么。感谢大家的澄清。我已经用附加问题编辑了我的原始帖子。
// New Delete Lines function based off your old one
private string DeleteLines(string input_buffer, int id)
{
    string output_buffer = "";

    using (StringReader sr = new StringReader(input_buffer))
    {
        while (true)
        {
            string line = sr.ReadLine();
            if (line != null)
            {
                if (String.Compare(line, id.ToString()) == 0)
                {
                }
                else
                {
                    // add it to the output_buffer plus the newline
                    output_buffer += (line + "\n");
                }
            }
            else
            {
                break;
            }
        }

    }
    return output_buffer;
}