调用时无法识别或使用 C# 路径 File.AppendAllText
C# Path not recognized or utilized when invoking File.AppendAllText
我正在尝试使用文件 class 在控制台和 winforms 桌面应用程序中处理文本文件,但出现以下异常:
“_Library.Logging”的类型初始值设定项抛出异常
根据我在此处阅读的内容,此错误通常是由 App.config 中的 Winfoms 应用程序问题引起的,但异常详细信息似乎指向其他地方:
System.ArgumentNullException: 值不能为空。参数名称:路径
在System.IO.File.AppendAllText(字符串路径,字符串内容)
文件操作的 MSDN 示例都对路径参数进行了硬编码,而没有提及使用 App.confiig 文件,因此我的假设是可以在不涉及 ConfigurationManager 的情况下执行此操作。
这是我正在尝试使用的代码
// in calling method
class Program_Console
{
private static StringBuilder SB4log = new StringBuilder();
public static void Main(string[] tsArgs)
{
// Conditionals dealing with argumentts from Task Scheduler
Save2Log("Calling _UI.exe via \"Process.Start()\"", true);
// try-catch-finally for Process.Start
}
private static void Save2Log(string msgTxt, bool noTS)
{
SB4log.AppendLine($"{msgTxt}");
if (noTS) Logging.SaveLog(SB4log);
else Logging.SaveLog_TimeStamp(SB4log);
SB4log.Clear();
}
}
// saving app progression messages to a single log txt file
public static class Logging
{
private static String filePath = Connections.LogPath();
private static StringBuilder SB4log = new StringBuilder();
public static void SaveLog(StringBuilder logTxt)
{
File.AppendAllText(filePath, logTxt.ToString());
logTxt.Clear();
}
}
// class for DB connection and file paths
public static class Connections
{
private static StringBuilder SB4log = new StringBuilder();
public static string AppPath()
{
string appRoot;
try
{
string appDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
SaveLog($"->App Path: {appDir}", true); // culprit
int loc = appDir.IndexOf("BURS");
appRoot = appDir.Substring(0, loc + 5);
}
catch (Exception ex)
{
// Exception response and MessageBox
}
return appRoot;
}
public static string ConsolePath() {}
public static string UIPath() {}
public static string LogPath()
{
string appRoot = AppPath();
string wrkDir = @"_Library\Data\BURS_Log.Txt";
string fullDir = $"{appRoot}{wrkDir}";
SaveLog($"->Log Path: {fullDir}\n", true); // culprit
return fullDir;
}
}
在逐步执行代码时,包含路径的变量的代码 -- filePath -- 具有预期值:“D:\BURS_Library\Data\BURS_Log.Txt”(引号用于显示没有不需要的空格被修剪)。根据 MSDN 的说法,如果它是格式错误的路径,将抛出异常,但该路径对我来说看起来有效。
为什么没有使用 Path 变量?
任何帮助将不胜感激。
编辑:扩展代码以显示从开始到结束的流程,因为原始的删节版本似乎令人困惑。已将文本“//culprit”添加到导致响应者指出的错误的两行。
不清楚 Connections
是什么,但给定 Connections.LogPath();
看来您正在调用 LogPath();
来设置 filePath
的值,这是一个问题,因为调用 AppPath
具有以下语句 SaveLog($"->App Path: {appDir}", true);
.
您没有包含具有 2 个参数的 SaveLog
版本,但假设它与您发布的版本相似,您正在尝试使用 filePath
时值没有尚未设置 - 这会导致问题。
我正在尝试使用文件 class 在控制台和 winforms 桌面应用程序中处理文本文件,但出现以下异常: “_Library.Logging”的类型初始值设定项抛出异常
根据我在此处阅读的内容,此错误通常是由 App.config 中的 Winfoms 应用程序问题引起的,但异常详细信息似乎指向其他地方:
System.ArgumentNullException: 值不能为空。参数名称:路径
在System.IO.File.AppendAllText(字符串路径,字符串内容)
文件操作的 MSDN 示例都对路径参数进行了硬编码,而没有提及使用 App.confiig 文件,因此我的假设是可以在不涉及 ConfigurationManager 的情况下执行此操作。
这是我正在尝试使用的代码
// in calling method
class Program_Console
{
private static StringBuilder SB4log = new StringBuilder();
public static void Main(string[] tsArgs)
{
// Conditionals dealing with argumentts from Task Scheduler
Save2Log("Calling _UI.exe via \"Process.Start()\"", true);
// try-catch-finally for Process.Start
}
private static void Save2Log(string msgTxt, bool noTS)
{
SB4log.AppendLine($"{msgTxt}");
if (noTS) Logging.SaveLog(SB4log);
else Logging.SaveLog_TimeStamp(SB4log);
SB4log.Clear();
}
}
// saving app progression messages to a single log txt file
public static class Logging
{
private static String filePath = Connections.LogPath();
private static StringBuilder SB4log = new StringBuilder();
public static void SaveLog(StringBuilder logTxt)
{
File.AppendAllText(filePath, logTxt.ToString());
logTxt.Clear();
}
}
// class for DB connection and file paths
public static class Connections
{
private static StringBuilder SB4log = new StringBuilder();
public static string AppPath()
{
string appRoot;
try
{
string appDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
SaveLog($"->App Path: {appDir}", true); // culprit
int loc = appDir.IndexOf("BURS");
appRoot = appDir.Substring(0, loc + 5);
}
catch (Exception ex)
{
// Exception response and MessageBox
}
return appRoot;
}
public static string ConsolePath() {}
public static string UIPath() {}
public static string LogPath()
{
string appRoot = AppPath();
string wrkDir = @"_Library\Data\BURS_Log.Txt";
string fullDir = $"{appRoot}{wrkDir}";
SaveLog($"->Log Path: {fullDir}\n", true); // culprit
return fullDir;
}
}
在逐步执行代码时,包含路径的变量的代码 -- filePath -- 具有预期值:“D:\BURS_Library\Data\BURS_Log.Txt”(引号用于显示没有不需要的空格被修剪)。根据 MSDN 的说法,如果它是格式错误的路径,将抛出异常,但该路径对我来说看起来有效。
为什么没有使用 Path 变量?
任何帮助将不胜感激。
编辑:扩展代码以显示从开始到结束的流程,因为原始的删节版本似乎令人困惑。已将文本“//culprit”添加到导致响应者指出的错误的两行。
不清楚 Connections
是什么,但给定 Connections.LogPath();
看来您正在调用 LogPath();
来设置 filePath
的值,这是一个问题,因为调用 AppPath
具有以下语句 SaveLog($"->App Path: {appDir}", true);
.
您没有包含具有 2 个参数的 SaveLog
版本,但假设它与您发布的版本相似,您正在尝试使用 filePath
时值没有尚未设置 - 这会导致问题。