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,903
地点
切萨皮克,va.
编程经验
10+
你是在Windows机器还是Linux盒子上?
如果后者,我可以看出它是如何发生的,因为* nix路径看起来不那么多。
如果在Windows上,那么这成为一个更有趣的问题。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
@skydiver 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";
然后,您可以执行以下操作以构建您的路径。 path.Combine. - 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,903
地点
切萨皮克,va.
编程经验
10+
是的,但在尝试访问系统目录时,这种情况下的错误将成为访问权限的风格。 OP报告的错误是关于"unsupported format"对于看起来像正常的Windows / NTFS路径的完全限定文件路径:"C:\ samplefiles \ log.txt".
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
是的,所以 @ mp3909. 解决路径问题后可能需要提高权限。所以;如果OP使用我发布的第一个和第二次剪辑的代码,它将正确构建他们尝试使用的路径。如果存在路径,它将根据它写入文件。如果没有,还有一些险恶的事情。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
是的,如果权限"C:\SampleFiles"限制目录,阻止普通用户在那里创建或修改文件。

但是,通常,大多数现代Windows程序员现在已经学会了使用最少的权利,而不是80年代,90年代和2000年代初。我记得内部Microsoft开发人员/用户需要多年的时间,以便停止自动运行admin。是的,值得试图查看是否成功运行升高,但在正常运行时失败。如果出现这种情况,通常值得努力弄清楚为什么而不是自动使用"运行我的代码时必须运行admin".
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
是的,但如果我能记得对。允许任何人写入根驱动系统目录被视为安全风险,并且在更高版本的Windows中,它是制作的,因此在开发人员希望访问根目录时,将需要提高权限。我也应该指出;如果路径是不存在的,则您还将收到错误"System.NotSupportedException: '不支持给定的路径格式。'" See here

549


OP可能忽略的事情之一是,如果它不存在,它们可能会知道StreamWriter将创建文件,但如果它不存在,它不会创建目录。如果路径不存在,则访问该路径时将抛出上述错误。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
答对了!目录甚至不存在!好的发现。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
我建议的另一件事是使用StreamWriter周围的块。
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
@skydiver 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";
然后,您可以执行以下操作以构建您的路径。 path.Combine. - 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行和调试中放置断点,然后告诉我们实际路径是什么。

作为旁边的说明,您真的应该使用您的应用程序数据或临时文件夹,而不是系统驱动器的根目录。


试过这不起作用
 

sh

众所周知的成员
加入
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));
驱动器是一个变量,获取应用程序运行的系统的系统基本目录。虽然子文件夹是您使用的文件夹的名称。 path.Combine. 将这些路径与您结合到一个完整的路径中,因此您不需要添加反斜杠等。 string.concat. 将您的文件名与扩展附加,从而完成路径建设。上 帖子13. you should be using the system namespaces Environment.GetFolderPath to retrieve the desktop location via Environment.SpecialFolder.Desktop.。有一种正确的方式和错误的方式来做事情,而且我只是试图让你做正确的方式。

由于您尚未告诉或向我们展示了您以来的帖子3以来,它有点难以帮助您进一步帮助您。例如,您在使用我提供的代码时是否有任何额外的错误?如果是这样,他们在哪里?如果没有,当您运行代码时发生了什么?你检查了是否是路径 文件夹 在执行代码之前存在?你拿到了我对这条道路所说的话吗? 文件夹 无法由StreamWriter创建?您是否还注意到,如果您在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));
驱动器是一个变量,获取应用程序运行的系统的系统基本目录。虽然子文件夹是您使用的文件夹的名称。 path.Combine. 将这些路径与您结合到一个完整的路径中,因此您不需要添加反斜杠等。 string.concat. 将您的文件名与扩展附加,从而完成路径建设。上 帖子13. you should be using the system namespaces Environment.GetFolderPath to retrieve the desktop location via Environment.SpecialFolder.Desktop.。有一种正确的方式和错误的方式来做事情,而且我只是试图让你做正确的方式。

由于您尚未告诉或向我们展示了您以来的帖子3以来,它有点难以帮助您进一步帮助您。例如,您在使用我提供的代码时是否有任何额外的错误?如果是这样,他们在哪里?如果没有,当您运行代码时发生了什么?你检查了是否是路径 文件夹 在执行代码之前存在?你拿到了我对这条道路所说的话吗? 文件夹 无法由StreamWriter创建?您是否还注意到,如果您在Windows上的有限用户帐户上,您的应用程序可能需要升高的权限来写入系统目录中的任何文件夹或文件,并且包括以编程方式在根目录中创建文件夹。在这种情况下,我已经向您提供了答案来修复。

我知道我给了你的工作原理,因为我从头开始写下并用我的所有回复来测试它,无论他们多么简单或简单。我概述了上面的可能原因 post 3。我建议再次阅读整个主题,以确保你没有错过任何东西。

小心地重读了所有建议的解决方案,它就像一项款待!
谢谢
 
最佳 底部