StreamWriter路径's format

mp3909

知名会员
已加入
2018年4月22日
留言内容
61
地点
英国
编程经验
3-5
这段代码

C#:
using System;
using System.IO;

class Program
{
    public static void Main(string[] args)
    {
        try
        {
            Console.WriteLine("Enter first number");
            int.TryParse(Console.ReadLine(), out int a);

            Console.WriteLine("Enter second number");
            int b = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine(b);

            int result = a / b;

            Console.WriteLine(result);
        }
        catch(Exception ex)
        {
            string filePath = @"‪‪‪C:\ SampleFiles \ log.txt";
            StreamWriter sw = new StreamWriter(filePath);
            sw.Write(ex.GetType().Name);
            sw.Write(ex.StackTrace);
            sw.Close();
            Console.WriteLine("There is a problem, please try later");
        }
    }

}

给我一个错误的说法"不支持给定路径的格式。" Line 24.
有人知道这是什么问题吗?
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,610
地点
弗吉尼亚州切萨皮克
编程经验
10+
您是在Windows机器还是Linux机器上?
如果是后者,我可以看到该错误将如何发生,因为* nix路径看起来不是这样。
如果在Windows上,那么这将成为一个更加有趣的问题。
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
@跳伞 doesn't Windows see Path.GetPathRoot(Environment.SystemDirectory); as a system directory? And if indeed it does, doesn't this mean that the user will likely need elevated permissions to create other directories or files in that system directory?

@ mp3909 假设有人在另一台计算机上使用此应用程序,除非您进行检查,否则程序将如何知道目录结构存在?

我还认为您可以改善路径构建变量。也许通过使用 字符串生成器 或像这样::

C#:
                string drive = Path.GetPathRoot(Environment.SystemDirectory); /* Gives you your C:\ */
                string subFolder = "SampleFiles";
                string fileName = "log";
                string ext = ".txt";
然后,您可以执行以下操作来构建路径。 路径组合 - String.Concat
C#:
                var dir = Path.Combine(drive, subFolder);
                var filePath = Path.Combine(dir, string.Concat(fileName, ext));
即使您自己在一台PC上创建路径,也不应假定路径存在,因为当您的应用程序在另一台PC上运行时,它将找不到该路径,因为该文件夹将不存在。建议进行简单检查::
C#:
                if (!(Directory.Exists(dir)))
                {
                    Directory.CreateDirectory(dir);
                }
此时,您可以运行您的作家::
C#:
StreamWriter sw = new StreamWriter(filePath);
                    sw.Write(ex.GetType().Name);
                    sw.Write(ex.StackTrace);
                    sw.Close();
As there is no need to check if the file exists, like we did with the directory, because the writer will create the file if it does not exist. But it won't create the directory if that does not exist. And even if your directory does not exist, you'd be getting a DirectoryNotFoundException and not a 不支持给定路径的格式。 error. My theory is that your path is not as you posted it above, and your path is most likely the culprit.

或者您的应用程序被剥夺了管理员权限。有两种方法可以解决此问题。 (仅当您的系统具有某些权限限制时,才执行这些步骤。)方法1以编程方式以admin ::身份运行:
C#:
            var RunAdminMode = new ProcessStartInfo
                {
                    UseShellExecute = true,
                    WorkingDirectory = Environment.CurrentDirectory,
                    FileName = Application.ExecutablePath, Verb = "runas"
                };
            var p = Process.Start(RunAdminMode);
另一个(最推荐)是使用app.manifest文件。>>右键单击您的项目>> Add >> New item >> app.manifest.
Next, under your solution explorer project name, open up the file you just added. Now look for this line :: <requestedExecutionLevel level="asInvoker" uiAccess="false" /> and change it to this :: <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> - Then save the file and run your application.

这样可以解决您的问题吗? -如果不是,请在第24行放置一个断点并进行调试,然后告诉我们实际路径是什么。

顺便提一句,您确实应该为此使用您的应用程序数据或临时文件夹,而不是系统驱动器的根目录。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,610
地点
弗吉尼亚州切萨皮克
编程经验
10+
是的,但是在那种情况下的错误将是尝试访问系统目录时拒绝访问的一种方式。 OP报告的错误是关于"unsupported format"用于看起来像普通Windows / NTFS路径的标准文件路径:"C:\ SampleFiles \ log.txt".
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
是的,所以 @ mp3909 解决路径问题后,可能需要提升的权限。所以;如果op使用我发布的代码的第一个和第二个片段,它将正确构建他们尝试使用的路径。如果路径存在,它将按原样写入文件。如果不是这样,则说明发生了一些险恶的事情。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,610
地点
弗吉尼亚州切萨皮克
编程经验
10+
是的,如果"C:\SampleFiles"目录受到限制,这阻止了普通用户在该目录中创建或修改文件。

总体而言,与80年代,90年代和2000年代初不同,大多数现代Windows程序员现在已经学会了使用最小权限。我记得内部Microsoft开发人员/用户花了数年时间才能停止以admin身份自动运行。是的,值得尝试查看是否可以成功提升运行,但如果正常运行则失败。如果出现这种情况,通常值得您找出原因,而不仅仅是自动进行"运行我的代码时必须以管理员身份运行".
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
是的,但如果我没记错的话。允许任何人写入根驱动器系统目录均被视为安全隐患,在更高版本的Windows中,这样做是为了使开发人员希望访问根目录时需要提升的权限。我还应该指出;如果路径不存在,您还会收到错误消息"System.NotSupportedException: '不支持给定路径的格式。'" See here

549


OP可能会忽略的一件事是,他们可能知道流编写器将在文件不存在的情况下创建文件,但在文件不存在的情况下将不会创建目录。如果该路径不存在,则在访问该路径时将引发上述错误。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,610
地点
弗吉尼亚州切萨皮克
编程经验
10+
答对了!该目录甚至不存在!好发现。
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
我建议的另一件事是在流媒体编写器周围使用块。
C#:
using (StreamWriter sw = new StreamWriter(filePath))
        {
            sw.Write("your text here");
        }
这样,一旦编写者完成写操作,就可以正确处置您使用的资源。

希望对您有所帮助。

通过手机回复
 

mp3909

知名会员
已加入
2018年4月22日
留言内容
61
地点
英国
编程经验
3-5
这很奇怪,因为下面的代码可以正常工作(它可以写到保存在我的桌面上的log.txt文件中)

C#:
using System;
using System.IO;

class Program
{

    public static void Main(string[] args)
    {
        if (Directory.Exists(@"C:\Users\mp88_\OneDrive\Desktop"))
        {
            StreamWriter sw = new StreamWriter(@"C:\Users\mp88_\OneDrive\Desktop\log.txt");
            sw.Write("Hello");
            sw.Close();
            Console.WriteLine("Path exists");
        }
        else
        {
            Console.WriteLine("Path does not exist");
        }
    }
}


但出于某些奇怪的原因,它不喜欢以下内容:

C#:
using System;
using System.IO;

class Program
{

    public static void Main(string[] args)
    {
        try
        {
            Console.WriteLine("Enter first number");
            int.TryParse(Console.ReadLine(), out int fn);

            Console.WriteLine("Enter second number");
            int sn = Convert.ToInt32(Console.ReadLine());

            int result = fn / sn;
        }
        catch(Exception ex)
        {
            StreamWriter sw = new StreamWriter(@"‪C:\Users\mp88_\OneDrive\Desktop\log.txt");
            sw.Write("Hello");
            sw.Close();
        }
    }

}
 

mp3909

知名会员
已加入
2018年4月22日
留言内容
61
地点
英国
编程经验
3-5
@跳伞 doesn't Windows see Path.GetPathRoot(Environment.SystemDirectory); as a system directory? And if indeed it does, doesn't this mean that the user will likely need elevated permissions to create other directories or files in that system directory?

@ mp3909 假设有人在另一台计算机上使用此应用程序,除非您进行检查,否则程序将如何知道目录结构存在?

我还认为您可以改善路径构建变量。也许通过使用 字符串生成器 or like this ::

C#:
                string drive = Path.GetPathRoot(Environment.SystemDirectory); /* Gives you your C:\ */
                string subFolder = "SampleFiles";
                string fileName = "log";
                string ext = ".txt";
然后,您可以执行以下操作来构建路径。 路径组合 - String.Concat
C#:
                var dir = Path.Combine(drive, subFolder);
                var filePath = Path.Combine(dir, string.Concat(fileName, ext));
即使您自己在一台PC上创建路径,也不应假定路径存在,因为当您的应用程序在另一台PC上运行时,它将找不到该路径,因为该文件夹将不存在。建议进行简单检查::
C#:
                if (!(Directory.Exists(dir)))
                {
                    Directory.CreateDirectory(dir);
                }
此时,您可以运行您的作家::
C#:
StreamWriter sw = new StreamWriter(filePath);
                    sw.Write(ex.GetType().Name);
                    sw.Write(ex.StackTrace);
                    sw.Close();
As there is no need to check if the file exists, like we did with the directory, because the writer will create the file if it does not exist. But it won't create the directory if that does not exist. And even if your directory does not exist, you'd be getting a DirectoryNotFoundException and not a 不支持给定路径的格式。 error. My theory is that your path is not as you posted it above, and your path is most likely the culprit.

或者您的应用程序被剥夺了管理员权限。有两种方法可以解决此问题。 (仅当您的系统具有某些权限限制时,才执行这些步骤。)方法1以编程方式以admin ::身份运行:
C#:
            var RunAdminMode = new ProcessStartInfo
                {
                    UseShellExecute = true,
                    WorkingDirectory = Environment.CurrentDirectory,
                    FileName = Application.ExecutablePath, Verb = "runas"
                };
            var p = Process.Start(RunAdminMode);
另一个(最推荐)是使用app.manifest文件。>>右键单击您的项目>> Add >> New item >> app.manifest.
Next, under your solution explorer project name, open up the file you just added. Now look for this line :: <requestedExecutionLevel level="asInvoker" uiAccess="false" /> and change it to this :: <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> - Then save the file and run your application.

这样可以解决您的问题吗? -如果不是,请在第24行放置一个断点并进行调试,然后告诉我们实际路径是什么。

顺便提一句,您确实应该为此使用您的应用程序数据或临时文件夹,而不是系统驱动器的根目录。


试过这没有用
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
定义"did not work"?

Show what you tried? Show me where you took on board where I suggested path building to you? If you did; you wouldn't still be using manually wrote-out paths. "‪C:\Users\mp88_\OneDrive\Desktop\log.txt" Microsoft have developed ways for us to determine the correct paths providing we understand what directory structure we are looking to build. That's why I gave you this ::
C#:
                string drive = Path.GetPathRoot(Environment.SystemDirectory); /* Gives you your C:\ */
                string subFolder = "SampleFiles";
                string fileName = "log";
                string ext = ".txt";
                var dir = Path.Combine(drive, subFolder); //This combines the two paths together.
                var filePath = Path.Combine(dir, string.Concat(fileName, ext));
drive是一个变量,它获取应用程序运行所在系统的系统基本目录。而子文件夹是您正在使用的文件夹的名称。 路径组合 将这些路径组合为一条完整的路径,因此您无需添加反斜杠等。 String.Concat 在文件名后面加上扩展名,从而完成路径构建。在 第13篇 you should be using the system namespaces Environment.GetFolderPath to retrieve the desktop location via Environment.SpecialFolder.Desktop。做事有对与错,我只是想让您以正确的方式做事。

由于自从发布3以来您还没有告诉我们或没有向您展示您尝试过的内容,因此很难再为您提供帮助。例如,使用我提供的代码时,您是否还遇到其他错误?如果是这样,他们在哪里?如果没有,那么运行代码时发生了什么?您是否检查过路径 文件夹 执行代码之前是否存在?你接受我对这条路的看法了吗 文件夹 不能由流作家创建?您是否还注意到,如果您使用Windows上的受限用户帐户,则您的应用程序可能需要提升的权限才能写入系统目录中的任何文件夹或文件,并且包括以编程方式在根目录中创建文件夹。在这种情况下,我已经为您提供了解决问题的答案。

我知道我给你的作品是什么,因为我从头开始编写它,并像对待所有答复一样自己对它进行了测试,无论这些答复多么琐碎或多么简单。我已经在上面概述了可能的原因 post 3。我建议再次阅读整个主题,以确保您不会错过任何内容。
 

mp3909

知名会员
已加入
2018年4月22日
留言内容
61
地点
英国
编程经验
3-5
Define "did not work"?

Show what you tried? Show me where you took on board where I suggested path building to you? If you did; you wouldn't still be using manually wrote-out paths. "‪C:\Users\mp88_\OneDrive\Desktop\log.txt" Microsoft have developed ways for us to determine the correct paths providing we understand what directory structure we are looking to build. That's why I gave you this ::
C#:
                string drive = Path.GetPathRoot(Environment.SystemDirectory); /* Gives you your C:\ */
                string subFolder = "SampleFiles";
                string fileName = "log";
                string ext = ".txt";
                var dir = Path.Combine(drive, subFolder); //This combines the two paths together.
                var filePath = Path.Combine(dir, string.Concat(fileName, ext));
drive是一个变量,它获取应用程序运行所在系统的系统基本目录。而子文件夹是您正在使用的文件夹的名称。 路径组合 将这些路径组合为一条完整的路径,因此您无需添加反斜杠等。 String.Concat 在文件名后面加上扩展名,从而完成路径构建。在 第13篇 you should be using the system namespaces Environment.GetFolderPath to retrieve the desktop location via Environment.SpecialFolder.Desktop。做事有对与错,我只是想让您以正确的方式做事。

由于自从发布3以来您还没有告诉我们或没有向您展示您尝试过的内容,因此很难再为您提供帮助。例如,使用我提供的代码时,您是否还遇到其他错误?如果是这样,他们在哪里?如果没有,那么运行代码时发生了什么?您是否检查过路径 文件夹 执行代码之前是否存在?你接受我对这条路的看法了吗 文件夹 不能由流作家创建?您是否还注意到,如果您使用Windows上的受限用户帐户,则您的应用程序可能需要提升的权限才能写入系统目录中的任何文件夹或文件,并且包括以编程方式在根目录中创建文件夹。在这种情况下,我已经为您提供了解决问题的答案。

我知道我给你的作品是什么,因为我从头开始编写它,并像对待所有答复一样自己对它进行了测试,无论这些答复多么琐碎或多么简单。我已经在上面概述了可能的原因 post 3。我建议再次阅读整个主题,以确保您不会错过任何内容。

再次仔细阅读所有建议的解决方案,它就像一种享受!
谢谢
 
最佳 底部