1

我制作了一个程序,该程序使用包含站点列表的预制文本文件。现在在某些计算机上该程序可以正常工作,但在我朋友的计算机上却不行。

我检查了我的 2 台 Windows 7 计算机和 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'

问题是我将这个文件放在主程序文件夹(应用程序文件)中,但它仍然找不到它。

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

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";
                }
            } 

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

注意:我不介意改变我使用此文件的方式,甚至以这种方式丢失并尝试在操作系统(win 7 和 XP)上工作的完全不同的方式。如果你建议我新的方式,我会很高兴尝试一下。

我的问题:

  1. 该程序怎么可能在某些计算机上运行而在某些计算机上却不行?
  2. 您会将文件放在程序文件夹以外的其他位置吗?

(对不起我的英语不好)

4

1 回答 1

5
该程序怎么可能在某些计算机上工作而在某些计算机上却不行?

因为程序依赖于特定于计算机的某些东西,而这两台计算机之间的某些东西是不同的。例如,您的错误消息说:

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

该程序正在用户文件夹中寻找一个文件;这是特定于每台机器上的每个用户的,不同的用户和不同的机器会有不同的文件。

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

我会吗?不,我不能,因为我不是那台机器上的那个用户。如果您的意思是“我的程序可以将文件放在不同的位置......”那么是的,它可以。

string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "fourmlinks.txt");

这将获得登录用户的私有应用程序数据的路径。如果您的计算机上的此文件夹中有“fourmlinks.txt”文件,但其他人的计算机上没有此文件,那么这将在您的计算机上运行,​​但在其他人的计算机上不起作用,正如您所要求的那样。

string path = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location),
    "fourmlinks.txt");

这将获得已安装文件的路径。如果您和其他人都安装了该程序,那么您和其他人都将拥有该文件。如果你们中的任何一个更改了文件,那么另一个会得到更改。

所以你应该总是使用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);
}

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

如果您希望每个用户都有自己的私有数据,并且在修改应用程序时不会被删除,那么您希望使用Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).

于 2012-11-08T20:01:39.867 回答