File.writeAllines不在C#中工作(Visual Studio 19)
我正在用c#做一个程序。我正在尝试使用C#的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
文件
类访问日志
文件夹中名为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很高兴你回答——你做了大量的挖掘!我故意把重点放在我提出的建议上,所以你的答案中有更多关于这个问题的细节,以及你关于“如果更新就复制”的建议。是的,我正在做一系列的改进