安装后程序找不到文件

时间:2012-11-08 18:58:58

标签: c# windows winforms text-files

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

我在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上运行。

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

我的问题:

  1. 该程序如何在某些计算机上运行,​​而在某些计算机中却没有?
  2. 你会把文件放在程序文件夹以外的其他地方吗?
  3. (对不起我的英文)

1 个答案:

答案 0 :(得分: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)