我做了一个程序,使用一个预先创build的文本文件,其中包含一个网站列表。 现在在一些电脑程序工作正常,但在我的朋友电脑它没有。
我检查了我的Windows 7电脑上的2个程序,1个XP,我没有任何错误。 这个程序在XP上用了一段时间,现在我的朋友想把它安装在家里的windows 7电脑上,但是程序在安装程序后没有find这个文件。
这是他得到的错误:
System.IO.FileNotFoundException: file not found 'C:\Users\eli\AppData\Roaming\fourmlinks.txt'. file name: 'C:\Users\eli\AppData\Roaming\fourmlinks.txt'
事情是,我把这个文件在主程序文件夹(应用程序文件),它仍然无法find它。
这是程序启动时用来查找文件的代码:
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)的工作。 如果你以新的方式给我build议,我会很乐意尝试一下。
我的问题:
(对不起我的英语不好)
这个程序怎么可能在某台电脑上运行,有些则不行?
因为程序依赖于计算机专用的东西,而这两台计算机之间的东西是不同的。 例如,您的错误消息说:
文件未找到'C:\ Users \ eli \ AppData \ Roaming \ fourmlinks.txt'
该程序正在查找Users文件夹中的文件; 这是特定于每台机器上的每个用户,不同的用户和不同的机器将具有不同的文件。
你会把文件放在与程序文件夹不同的地方吗?
我会吗? 不,我不能,因为我不是那台机器上的用户。 如果你的意思是“我的程序可以把文件放在不同的地方…”,那么是的,它可以。
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)
。