C#文件处理:在可执行文件所在目录创建文件

10

我正在创建一个独立的应用程序,将分发给许多用户。现在每个用户可能会将可执行文件放置在其计算机上的不同位置。
我希望在可执行文件所在目录中创建一个新文件。因此,如果用户的可执行文件在以下目录中:

C:\exefile\

文件是在那里创建的,但如果用户将可执行文件存储在:

C:\Users\%Username%\files\

新文件应该在那里创建。

我不想在我的应用程序中硬编码路径,而是要识别可执行文件所在的位置,并在该文件夹中创建文件。我该怎么做?


这是通过独立应用程序默认完成的。 - Amiram Korach
用户可以选择将文件放置在需要提升权限才能访问的位置,或者可能将其放置在只读文件系统上。但是,当您的程序运行时,不一定会发生相同的权限提升。最好将您创建的任何文件放置在文件系统的适当部分中。 - Damien_The_Unbeliever
使用IsolatedStorage代替...即使在最低权限下,您也可以访问它。 - Anirudha
@Damien_The_Unbeliever:没错。我忘记考虑到那个了。Tigran的解决方案包含了你建议的内容。谢谢!还有,谢谢你提供的那份PDF文件。非常有用! - darnir
6个回答

28

不要在可执行文件所在的目录中创建文件。特别是在市场上提供的最新操作系统中,您可能会在文件创建过程中遇到安全问题。为了确保文件创建过程和数据永久性,可以使用以下代码:

var systemPath = System.Environment.
                             GetFolderPath(
                                 Environment.SpecialFolder.CommonApplicationData
                             );
var complete = Path.Combine(systemPath , "files");

这将生成一个类似于C:\Documents and Settings\%USER NAME%\Application Data\files文件夹的路径,您可以确保拥有写入权限。


非常感谢!我忘记了新操作系统中的特权升级。这解决了我的问题。 - darnir

13

只需使用File.Create

File.Create("fileName");

这将在不指定完整路径的情况下在您的可执行程序内创建文件。

别忘了添加:

using System.IO;

3
不会,它将会被创建在“当前文件夹”中,这个文件夹可以被程序更改。 - H H
@HenkHolterman,您是正确的,但如果OP能够更改当前文件夹,他就不会问这个问题了。 - Saeed Amiri
这可能是由某个库引起的,甚至可能是通过使用FileDialog实现的。 - H H
如果用户打开命令提示符并处于c:\otherdir目录中,并运行"c:\exefile\my.exe",则它将在c:\otherdir而不是c:\exefile中创建文件。 - Steve Smith

8
您可以使用以下方法获取新文件的完整路径:
string path = Path.GetDirectoryName(Application.ExecutablePath) + "\\mynewfile.txt" 

2

2
在现代操作系统中,"接受的答案"是指:
var systemPath = System.Environment.GetFolderPath(
    Environment.SpecialFolder.CommonApplicationData
);
var complete = Path.Combine(systemPath , "files");

将生成一个与用户无关的路径,例如:"C:\ProgramData\files"

要生成类似于用户基础路径的路径:"C:\Documents and Settings\%USER NAME%\Application Data\files"

您应该使用 SpecialFolder.ApplicationDataSpecialFolder.LocalApplicationData


0

我喜欢给用户选择权。我会将目录默认为 Environment.SpecialFolder.CommonApplicationData 等内容,并允许他们自行阅读和编辑路径。如果在控制台应用程序中,在帮助中显示该路径并允许他们通过命令行参数传递它。

这样可以避免他们费时地寻找文件夹。如果他们指向的路径无法写入,则引发错误并让他们决定如何处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接