【问题标题】:program can't find file after install程序安装后找不到文件
【发布时间】:2012-11-08 18:58:57
【问题描述】:

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

我在我的 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. 您会将文件放在程序文件夹以外的其他位置吗?

(对不起我的英语)

【问题讨论】:

  • 您确定您没有修改您的用户文件夹具有特定的安全权限?
  • 我认为 .NET 路径是相对的......如果文件在同一个文件夹中,你不应该需要 exe 路径..
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • @JohnSaunders 您修改了标题,但您仍然在其中留下了所有这些语法错误:-) Samy - 您在异常中获得的路径是否正确?该文件应该在其他地方吗?还是您的问题是文件没有在安装中部署?
  • 如果您的 Visual Studio 解决方案中有 .txt 文件,请打开其属性并设置 Copy To Output = Copy Always。您应该能够使用FileInfo file = new FileInfo("filename.txt"); 访问该文件(如果它位于项目的根文件夹中)。我刚刚对其进行了测试,它可以在使用 clickonce 部署时在 Win 7 上运行。不知道 XP。

标签: c# windows winforms text-files


【解决方案1】:
程序怎么可能在某些计算机上运行而在某些计算机上却不行?

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

找不到文件'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)

【讨论】:

  • 哇!谢谢你提供的所有信息。但我有一个问题:这段代码可以在 XP 上运行吗?Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)
  • @Samy,即 .NET 代码。如果 XP 机器安装了 .NET,它将工作。
  • IsolatedStorage 怎么样?
  • @Kiquenet,对于需要管理员配额的桌面应用程序,您可以使用独立存储而不是 Environment.SpecialFolder.ApplicationData。你有使用它的问题吗?如果是这样,请发布一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 2023-02-06
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多