安装后程序找不到文件

sam*_*amy 1 c# windows text-files winforms

我制作了一个程序,它使用一个包含网站列表的预制文本文件.现在在一些计算机上程序运行正常但是,在我的朋友计算机中它没有.

我检查我的Windows 7计算机中的2个程序,1 xp,我没有任何错误.这个程序在XP上使用了一段时间,现在我的朋友想在家里的Windows 7计算机上安装它,但程序在安装程序后找不到该文件.

这是他得到的错误:

System.IO.FileNotFoundException: file not found 'C:\Users\eli\AppData\Roaming\fourmlinks.txt'.
file name: 'C:\Users\eli\AppData\Roaming\fourmlinks.txt'
Run Code Online (Sandbox Code Playgroud)

问题是我将这个文件发送到主程序文件夹(应用程序文件)中,它仍然无法找到它.

这是我在程序启动时用来查找文件的代码:

sring path = "";
path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\fourmlinks.txt";
            System.OperatingSystem osInfo = System.Environment.OSVersion;
            if (osInfo.Platform == PlatformID.Win32NT)
            {
                if (osInfo.Version.Major == 5 && osInfo.Version.Minor != 0)
                {
                    //running XP
                    //path = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\fourmlinks.txt";
                    path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\fourmlinks.txt";
                }
            } 
Run Code Online (Sandbox Code Playgroud)

你可以看到,我试图确保它可以在Windows 7和Windows XP上运行.

注意:我不介意改变我使用这个文件的方式,甚至以这种方式丢失并尝试完全不同的方式,这将适用于操作系统(赢7和XP).如果你建议我新的方式,我会很乐意试一试.

我的问题:

  1. 如何在某些计算机上运行该程序,在某些计算机中运行?
  2. 你会把文件放在程序文件夹以外的其他地方吗?

(对不起我的英语不好)

Dou*_*rch 5

该程序如何在某些计算机上运行,​​而在某些计算机中却没有?

因为程序取决于计算机特定的东西,这两台计算机之间有所不同.例如,您的错误消息显示:

找不到文件'C:\ Users\eli\AppData\Roaming\fourmlinks.txt'

该程序正在"用户"文件夹中查找文件; 这是特定于每台机器上的每个用户,不同的用户和不同的机器将具有不同的文件.

你会把文件放在程序文件夹以外的其他地方

我会吗?不,我不能,因为我不是那台机器上的那个用户.如果你的意思是"我的程序可以把文件放在不同的地方......"那么是的,它可以.

string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "fourmlinks.txt");
Run Code Online (Sandbox Code Playgroud)

这将获得登录用户的私有应用程序数据的路径.如果您的计算机上的此文件夹中有"fourmlinks.txt"文件但其他人的计算机上没有此文件,那么这将在您的计算机上运行,​​但不会在其他人的计算机上运行,​​如您所述.

string path = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location),
    "fourmlinks.txt");
Run Code Online (Sandbox Code Playgroud)

这将获得已安装文件的路径.如果您和其他人都安装了该程序,那么您和其他人都将拥有该文件.如果您更改文件,则另一个获取更改.

你应该总是使用GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)吗?嗯,这取决于.GetExecutingAssembly().Location通常是标准用户无法写入的地方,只能读取.如果您希望用户只阅读并且从不写入您的数据,那么这是一个放置它的好地方.如果你不这样做,那就不是.

如果要为用户创建新文件以进行写入和读取,请写入Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).如果要在应用程序中安装一些起始数据但允许用户更改它,则应在应用程序中包含起始数据文件.它将被安装到System.Reflection.Assembly.GetExecutingAssembly().Location.那你的应用程序应该做的事情如下:

string fileName = "fourmlinks.txt";
string target = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), fileName);
if (!File.Exists(target))
{
    string source = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), fileName);
    File.Copy(source, target);
}
Run Code Online (Sandbox Code Playgroud)

GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)和之间的另一个重要区别Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)是前者是安装程序包的一部分; 如果用户卸载或更新您的应用程序,则将删除所有运行时更改.

如果您希望每个用户拥有自己的私有数据,但在修改应用程序时不会将其删除,那么您需要使用Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).