StreamWriter 不附加到文件,而是在不同的目录中创建一个新文件
StreamWriter not appending to file, instead creating a new file in different directory
在对源文件中的某些数据进行某些更改后,我试图从一个文件写入临时文件。这一直有效,直到我将此逻辑提取到它自己的函数中。
在 运行 进行一些测试后,我注意到只有第一行被保存到我指定位置的文件中。调试后,我能够从对该函数的第二次调用中看到文件位置在一个完全不同的位置。
我有两个问题,第一 - 为什么会这样?第二 - 确保此问题得到修复并且不再发生的最佳方法是什么?
str[] 是一次一行被分隔符分割的文件。
filename 是文件目录中包含的特定文件的名称(此程序循环遍历多个文件)。
public static void writeFile(string[] str, string filename)
{
rowCount++;
using (StreamWriter sw = new StreamWriter(filename.Substring(0, filename.Length - 4) + "_tmp.txt", true, System.Text.Encoding.Unicode))
{
string tempString = String.Empty;
for (int i = 0; i < str.Length; i++)
{
if (isMRT)
{
tempString += str[i] + ",";
}
else
{
tempString += str[i] + "|";
}
}
logger.LogMessage("Writting line to file: " + "Row #: " + rowCount + " ,File Path: " + filename.Substring(0, filename.Length - 4) + "_tmp.txt");
sw.WriteLine(tempString);
}
}
编辑:
这是我的目录和文件列表以及调用写入方法的函数
static string directory = ConfigurationManager.AppSettings["Directory"];
static List<String> fileNames = Directory.GetFiles(directory).ToList();
private static void activityCheck(string filename, string[] allLines)
{
foreach (string nextLine in allLines.Skip(1))
{
string[] tempLine;
if (isMRT)
{
tempLine = nextLine.Split(',');
}
else
{
tempLine = nextLine.Split('|');
}
logger.LogMessage("Checking Activity flag...");
if (tempLine[count].Length == 6)
{
checkColumn(tempLine);
logger.LogMessage("Activity flag is OK");
writeFile(tempLine, filename);
}
else if (tempLine[count].Length > 6)
{
tempLine[count] = tempLine[count].Trim();
checkColumn(tempLine);
logger.LogMessage("FIXED Activity flag");
writeFile(tempLine, filename);
}
else
{
logger.LogMessage("The Activity flag did not have enough numbers in Row #: " +rowCount);
//throw new Exception("There are not enough numbers in the Activity flag");
}
}
}
编辑2:
新制作的临时文件会在项目的 bin 文件夹中的 Visual Studio 文件夹中创建。不确定这对以前可能 运行 的人是否有用。
我找到了解决问题的方法。我最初只是传递文件名而不是整个路径。当然,我错过了一个函数调用,我仍然在其中传递文件名,而不是通向项目目录中创建的临时文件的路径。
找到后快速修复:
activityCheck(nameOfFile, allLines);
至
activityCheck(pathToFile, allLines);
如果有人发现在 Project/bin/Debug 位置创建了文件并且您知道您正确设置了目标目录,请仔细检查您传递的是实际路径。
在对源文件中的某些数据进行某些更改后,我试图从一个文件写入临时文件。这一直有效,直到我将此逻辑提取到它自己的函数中。
在 运行 进行一些测试后,我注意到只有第一行被保存到我指定位置的文件中。调试后,我能够从对该函数的第二次调用中看到文件位置在一个完全不同的位置。
我有两个问题,第一 - 为什么会这样?第二 - 确保此问题得到修复并且不再发生的最佳方法是什么?
str[] 是一次一行被分隔符分割的文件。 filename 是文件目录中包含的特定文件的名称(此程序循环遍历多个文件)。
public static void writeFile(string[] str, string filename)
{
rowCount++;
using (StreamWriter sw = new StreamWriter(filename.Substring(0, filename.Length - 4) + "_tmp.txt", true, System.Text.Encoding.Unicode))
{
string tempString = String.Empty;
for (int i = 0; i < str.Length; i++)
{
if (isMRT)
{
tempString += str[i] + ",";
}
else
{
tempString += str[i] + "|";
}
}
logger.LogMessage("Writting line to file: " + "Row #: " + rowCount + " ,File Path: " + filename.Substring(0, filename.Length - 4) + "_tmp.txt");
sw.WriteLine(tempString);
}
}
编辑: 这是我的目录和文件列表以及调用写入方法的函数
static string directory = ConfigurationManager.AppSettings["Directory"];
static List<String> fileNames = Directory.GetFiles(directory).ToList();
private static void activityCheck(string filename, string[] allLines)
{
foreach (string nextLine in allLines.Skip(1))
{
string[] tempLine;
if (isMRT)
{
tempLine = nextLine.Split(',');
}
else
{
tempLine = nextLine.Split('|');
}
logger.LogMessage("Checking Activity flag...");
if (tempLine[count].Length == 6)
{
checkColumn(tempLine);
logger.LogMessage("Activity flag is OK");
writeFile(tempLine, filename);
}
else if (tempLine[count].Length > 6)
{
tempLine[count] = tempLine[count].Trim();
checkColumn(tempLine);
logger.LogMessage("FIXED Activity flag");
writeFile(tempLine, filename);
}
else
{
logger.LogMessage("The Activity flag did not have enough numbers in Row #: " +rowCount);
//throw new Exception("There are not enough numbers in the Activity flag");
}
}
}
编辑2: 新制作的临时文件会在项目的 bin 文件夹中的 Visual Studio 文件夹中创建。不确定这对以前可能 运行 的人是否有用。
我找到了解决问题的方法。我最初只是传递文件名而不是整个路径。当然,我错过了一个函数调用,我仍然在其中传递文件名,而不是通向项目目录中创建的临时文件的路径。
找到后快速修复:
activityCheck(nameOfFile, allLines);
至
activityCheck(pathToFile, allLines);
如果有人发现在 Project/bin/Debug 位置创建了文件并且您知道您正确设置了目标目录,请仔细检查您传递的是实际路径。