我正在用c#为Windows7编写一个非常好的程序... 但现在我开始构建一个将程序文件复制到“C:\ Program Files”的设置。
现在程序在该文件夹中有很多问题:
1)如果我取消OpenFileDialog,我将获得异常
2)我的程序不再将文件写入AppData文件夹
3)由于权限
,程序无法在自己的目录中打开实习文件我不知道我能做些什么...
有人可以帮助我吗?
修改
也许你不明白我的问题。
我编写了一个在C:\ myprogram中工作正常的程序。 我制作了一个安装程序,将文件复制到C:\ Program Files目录中,当我将文件复制到该目录时,它是一样的
这3分不起作用!
如果我的程序在Program Files文件夹中,则无法打开像C:\ Program Files \ myprogram \ xsl \ test.xsl这样的文件,无法将文件写入AppData文件夹。
如果我将程序安装到C:\ lalala中,它将起作用!
答案 0 :(得分:5)
好的 - 我找到了答案:
我必须使用
FileStream fs = File.OpenRead(tmpfile)
而不是
FileStream fs = new FileStream(tmpfile, FileMode.Open);
答案 1 :(得分:1)
要将文件复制到Program Files或任何特权位置,该进程必须由提升的管理员运行。由于您正在谈论“复制”文件和“OpenFileDialog”,听起来您正在运行.NET进程来执行复制,而不是Windows Installer。通常,这应该由安装程序而不是您的应用程序完成。您的应用需要在其清单中设置requireAdministrator或仅为该特定操作提升。有关详细信息,请阅读UAC。首先,我建议您阅读CodePlex上的UAC: The Definitive Guide。
答案 2 :(得分:1)
你真的应该使用Windows安装程序。它处理与instasllation相关的问题,并确保提升其权限级别以完成必要的工作。
如果您没有正确升级,UAC将在幕后做很多事情,这会完全改变您的程序看到文件系统的方式。
此外,当您打开程序目录中的文件时,您只能以只读模式打开这些文件,或者您将获得文件异常。
答案 3 :(得分:1)
或者,如果这个上面的解决方案不起作用('System.IO.FileStream'不包含带有1个参数的构造函数),那么试试这个:
FileStream file = new FileStream(fileName,FileMode.Open,FileAccess.Read);