Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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
File.writeAllines不在C#中工作(Visual Studio 19)_C#_Visual Studio_File - Fatal编程技术网

File.writeAllines不在C#中工作(Visual Studio 19)

File.writeAllines不在C#中工作(Visual Studio 19),c#,visual-studio,file,C#,Visual Studio,File,我正在用c#做一个程序。我正在尝试使用C#的文件类访问日志文件夹中名为counter.txt的文件。我正在读取文件,将唯一一行存储在名为count的变量中,将其增加1,然后将其写回文件。阅读和增量式是有效的,但写作却不行。我尝试为输出容器使用不同的数据类型(string[],List,…)。什么都不管用。我遵循一个教程,代码在那里运行良好。我想这是Visual Studio 19还是防病毒/权限问题?这是代码,任何帮助都将不胜感激 using System; using System.Colle

我正在用c#做一个程序。我正在尝试使用C#的
文件
类访问
日志
文件夹中名为
counter.txt的文件。我正在读取文件,将唯一一行存储在名为
count
的变量中,将其增加1,然后将其写回文件。阅读和增量式是有效的,但写作却不行。我尝试为输出容器使用不同的数据类型(
string[]
List
,…)。什么都不管用。我遵循一个教程,代码在那里运行良好。我想这是Visual Studio 19还是防病毒/权限问题?这是代码,任何帮助都将不胜感激

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Reflection;

namespace Program
{
    class Logger
    {

        private int count = 0;

        // setup
        public void Start()
        {
            string counterFile = @".\\Logs\\counter.txt";

            string line = File.ReadAllLines(counterFile)[0];
            count = int.Parse(line);
            count++;
            string[] toWrite = {count.ToString()};
            Console.WriteLine(counterFile);
            File.WriteAllLines(counterFile, toWrite);
            Console.WriteLine(count);
        }
    }
}
文件结构(Logger.cs是我正在使用的文件):

如果文件路径正确,并且应用程序能够访问该文件夹,文件未锁定等,则代码工作正常

我正在尝试以下代码:

using System;
using System.IO;

namespace ConsoleApp4
{
    class Program
    {
        static void Main(string[] args)
        {
            int count;
            string counterFile = @"D:\tmp\counter.txt";

            string line = File.ReadAllLines(counterFile)[0];
            count = int.Parse(line);
            count++;
            string[] toWrite = { count.ToString() };
            Console.WriteLine(counterFile);
            File.WriteAllLines(counterFile, toWrite);
            Console.WriteLine(count);
        }
    }
}
文件中包含5。结果如下:

更新后的文件如下所示:


更新。您必须检查您的文件是否已在生成时复制。这可能是您的问题

如评论中所述,问题是您已将
counter.txt
添加到Visual Studio,并将“复制到输出目录”属性设置为“始终”

这意味着无论何时构建项目,VisualStudio都会将该
counter.txt
复制到
bin
目录中,覆盖以前存在的任何文件

当然,您的应用程序正在修改
bin
目录中的副本

一个更好的方法是在VisualStudio中完全从文件列表中删除
counter.txt
,如果文件不存在,则使用所有解决问题的逻辑来创建该文件。比如:

class Logger
{

    private int count = 0;

    // setup
    public void Start()
    {
        string counterDirectory = "Logs";
        string counterFile = Path.Join(counterDirectory, "counter.txt");

        if (!Directory.Exists(counterDirectory))
        {
            Directory.CreateDirectory(counterDirectory);
        }

        if (File.Exists(counterFile))
        {  
            string line = File.ReadAllLines(counterFile)[0];
            count = int.Parse(line);
            count++;
        }
        else
        {
            count = 1;
        }

        string[] toWrite = {count.ToString()};
        Console.WriteLine(counterFile);

        File.WriteAllLines(counterFile, toWrite);
        Console.WriteLine(count);
    }
}
class Logger
{

    private int count = 0;

    // setup
    public void Start()
    {
        string applicationDirectory = Path.GetDirectoryName(typeof(Logger).Assembly.Location);
        string counterDirectory = Path.Join(applicationDirectory , "Logs");
        string counterFile = Path.Join(counterDirectory, "counter.txt");

        if (!Directory.Exists(counterDirectory))
        {
            Directory.CreateDirectory(counterDirectory);
        }

        if (File.Exists(counterFile))
        {  
            string line = File.ReadAllLines(counterFile)[0];
            count = int.Parse(line);
            count++;
        }
        else
        {
            count = 1;
        }

        string[] toWrite = {count.ToString()};
        Console.WriteLine(counterFile);

        File.WriteAllLines(counterFile, toWrite);
        Console.WriteLine(count);
    }
}
class Logger
{

    private int count = 0;

    // setup
    public void Start()
    {
        string applicationDirectory = Path.GetDirectoryName(typeof(Logger).Assembly.Location);
        string counterDirectory = Path.Join(applicationDirectory , "Logs");
        string counterFile = Path.Join(counterDirectory, "counter.txt");

        if (!Directory.Exists(counterDirectory))
        {
            Directory.CreateDirectory(counterDirectory);
        }

        if (File.Exists(counterFile))
        {  
            string contents = File.ReadAllText(counterFile);
            count = int.Parse(contents);
            count++;
        }
        else
        {
            count = 1;
        }

        Console.WriteLine(counterFile);

        File.WriteAllText(counterFile, count.ToString());
        Console.WriteLine(count);
    }
}

在某个时候,您将遇到的另一个问题是,文件的路径是相对的,因此是相对于用户的当前工作目录的

这可能是包含应用程序的目录,但可能不是:尝试打开
bin
文件夹中的命令提示符,然后运行
Debug\YourApplication.exe
,查看
日志是否在当前目录中创建

相反,您可能希望执行以下操作:

class Logger
{

    private int count = 0;

    // setup
    public void Start()
    {
        string counterDirectory = "Logs";
        string counterFile = Path.Join(counterDirectory, "counter.txt");

        if (!Directory.Exists(counterDirectory))
        {
            Directory.CreateDirectory(counterDirectory);
        }

        if (File.Exists(counterFile))
        {  
            string line = File.ReadAllLines(counterFile)[0];
            count = int.Parse(line);
            count++;
        }
        else
        {
            count = 1;
        }

        string[] toWrite = {count.ToString()};
        Console.WriteLine(counterFile);

        File.WriteAllLines(counterFile, toWrite);
        Console.WriteLine(count);
    }
}
class Logger
{

    private int count = 0;

    // setup
    public void Start()
    {
        string applicationDirectory = Path.GetDirectoryName(typeof(Logger).Assembly.Location);
        string counterDirectory = Path.Join(applicationDirectory , "Logs");
        string counterFile = Path.Join(counterDirectory, "counter.txt");

        if (!Directory.Exists(counterDirectory))
        {
            Directory.CreateDirectory(counterDirectory);
        }

        if (File.Exists(counterFile))
        {  
            string line = File.ReadAllLines(counterFile)[0];
            count = int.Parse(line);
            count++;
        }
        else
        {
            count = 1;
        }

        string[] toWrite = {count.ToString()};
        Console.WriteLine(counterFile);

        File.WriteAllLines(counterFile, toWrite);
        Console.WriteLine(count);
    }
}
class Logger
{

    private int count = 0;

    // setup
    public void Start()
    {
        string applicationDirectory = Path.GetDirectoryName(typeof(Logger).Assembly.Location);
        string counterDirectory = Path.Join(applicationDirectory , "Logs");
        string counterFile = Path.Join(counterDirectory, "counter.txt");

        if (!Directory.Exists(counterDirectory))
        {
            Directory.CreateDirectory(counterDirectory);
        }

        if (File.Exists(counterFile))
        {  
            string contents = File.ReadAllText(counterFile);
            count = int.Parse(contents);
            count++;
        }
        else
        {
            count = 1;
        }

        Console.WriteLine(counterFile);

        File.WriteAllText(counterFile, count.ToString());
        Console.WriteLine(count);
    }
}

另外,读/写文件的代码过于复杂:这里不需要使用数组,因为文件只包含一行!您可以通过以下方式逃脱:

class Logger
{

    private int count = 0;

    // setup
    public void Start()
    {
        string counterDirectory = "Logs";
        string counterFile = Path.Join(counterDirectory, "counter.txt");

        if (!Directory.Exists(counterDirectory))
        {
            Directory.CreateDirectory(counterDirectory);
        }

        if (File.Exists(counterFile))
        {  
            string line = File.ReadAllLines(counterFile)[0];
            count = int.Parse(line);
            count++;
        }
        else
        {
            count = 1;
        }

        string[] toWrite = {count.ToString()};
        Console.WriteLine(counterFile);

        File.WriteAllLines(counterFile, toWrite);
        Console.WriteLine(count);
    }
}
class Logger
{

    private int count = 0;

    // setup
    public void Start()
    {
        string applicationDirectory = Path.GetDirectoryName(typeof(Logger).Assembly.Location);
        string counterDirectory = Path.Join(applicationDirectory , "Logs");
        string counterFile = Path.Join(counterDirectory, "counter.txt");

        if (!Directory.Exists(counterDirectory))
        {
            Directory.CreateDirectory(counterDirectory);
        }

        if (File.Exists(counterFile))
        {  
            string line = File.ReadAllLines(counterFile)[0];
            count = int.Parse(line);
            count++;
        }
        else
        {
            count = 1;
        }

        string[] toWrite = {count.ToString()};
        Console.WriteLine(counterFile);

        File.WriteAllLines(counterFile, toWrite);
        Console.WriteLine(count);
    }
}
class Logger
{

    private int count = 0;

    // setup
    public void Start()
    {
        string applicationDirectory = Path.GetDirectoryName(typeof(Logger).Assembly.Location);
        string counterDirectory = Path.Join(applicationDirectory , "Logs");
        string counterFile = Path.Join(counterDirectory, "counter.txt");

        if (!Directory.Exists(counterDirectory))
        {
            Directory.CreateDirectory(counterDirectory);
        }

        if (File.Exists(counterFile))
        {  
            string contents = File.ReadAllText(counterFile);
            count = int.Parse(contents);
            count++;
        }
        else
        {
            count = 1;
        }

        Console.WriteLine(counterFile);

        File.WriteAllText(counterFile, count.ToString());
        Console.WriteLine(count);
    }
}

问题中的代码运行良好。问题是您正在查看错误的文件。由于您将文件设置为“始终复制”
,因此每次运行应用程序时,
bin
文件夹(代码所在的位置)中的文件都会被替换,给人留下代码无法运行的印象

您有两种选择:

  • 仅在需要时复制文件,这意味着将
    Copy to Output directory
    属性设置为
    Copy if newer
    ,或者
  • ,从Visual Studio中删除该文件,因为它不是真正的资产,并在不存在时创建它

  • 控制台输出工作正常。不过,该文件没有更改。我想跟踪程序多次运行之间的计数(存储在counter.txt文件中)。您不能弄乱项目中的文件和输出文件夹中的文件。@CppPythonDude,它解决了您的问题吗?注释不用于扩展讨论或调试评估;这段对话已经结束。如果有人问你更多的细节,请在你的问题中加入信息,而不是在评论中回复。(如果“移动到聊天室”会更好)按钮出现在前面:当涉及多个人时,它似乎不会弹出,这意味着评论是执行调试的唯一地方,需要获得足够的细节来提供答案)@CamiloTerevinto很高兴你回答——你做了大量的挖掘!我故意把重点放在我提出的建议上,所以你的答案中有更多关于这个问题的细节,以及你关于“如果更新就复制”的建议。是的,我正在做一系列的改进