我制作了一个程序,它使用一个包含网站列表的预制文本文件。 现在在某些计算机上,该程序运行正常,但在我的朋友计算机中却没有。
我在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)。如果你建议我采用新的方式,我会很乐意试一试。
我的问题:
(对不起我的英文)
答案 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)
。