为什么我不能写入 .txt 文件?

Why can't I write to the .txt file?

我想写入一个txt文件,但是我得到

access to the path is denied

每次。我尝试了 google 搜索中的许多建议。 None 其中有效:例如以管理员身份启动、向不同用户授予完全访问权限等。

test.txt 位于项目的根文件夹中,例如:"MyProject/test.txt"..

这是代码:

private void LikeIt()
{
    Task.Run(() =>
    {       
        using (System.IO.StreamWriter file =
        new System.IO.StreamWriter(File.OpenWrite("test.txt")))
        {
            foreach (var line in ReadFile())
            {
                // If the line doesn't contain the same ID, write the line to the file. 
                if (!line.Contains(App.Moviess.Filmerna[index].id.ToString()))
                {
                    file.WriteLine(App.Moviess.Filmerna[index].id.ToString() + "\r\n");
                }
            }
        }
    });
}

private List<string> ReadFile()
{
    List<string> lines = System.IO.File.ReadAllLines(@"C:\Users\Tomas\Desktop\MovieStarz\MovieStarz\WriteText.txt").ToList();
    return lines;
}

您应该在 using 指令中打开您的文件。如果不这样做,您的文件将保持打开状态,并且在以下时间后无法访问:

using(var fs = File.OpenWrite("test.txt"))
using(var file = new System.IO.StreamWriter(fs))
{
    // your code here
}

可能您要写入的文件已被其他程序打开。所以你需要设置 FileShare 属性,

using (Stream fs = System.IO.File.Open("test.txt", 
                                      FileMode.OpenOrCreate, 
                                      FileAccess.Write, 
                                      FileShare.ReadWrite)) 
{
  using(var file = new System.IO.StreamWriter(fs))
  {
     ...
  }
}

这里:

var sourceFile = "text.txt";
var targetFile = @"C:\Users\Tomas\Desktop\MovieStarz\MovieStarz\WriteText.txt";
var id = App.Moviess.Filmerna[index].id.ToString();

var lines = File.ReadAllLines(sourceFile)
    .Where(l => l.Contains(id))
    .ToArray();

File.AppendAllLines(targetFile, lines);

此代码打开文件、读取内容并关闭它。然后打开另一个文件,写入必要的内容并关闭它。

打开和关闭是自动完成的,您从未同时打开过两个文件。

如果这不起作用:

  • 您的文件可能被另一个进程锁定。 (尝试重启电脑)
  • 你的程序没有访问该文件的权限(尝试将文件从 C:\Users 中取出)
  • 因为你是异步的,所以你必须保证两个线程不会同时访问文件:

    private static readonly object fileLock = new object();
    private void LikeIt()
    {
        Task.Run(() =>
        {       
            lock(fileLock){
               //do the stuff here
            }
        });
    }