如何将目录设置为我的应用程序的安装位置?

时间:2013-06-08 21:20:00

标签: c# winforms

我用innosetup来安装我的应用程序。 例如,所有文件都在程序文件\ test中 在目录中我有我的程序的exe文件和ffmpeg.exe

现在在我的代码中我做了:

class Ffmpeg
    {
        NamedPipeServerStream p;
        String pipename = "mytestpipe";
        byte[] b;
        System.Diagnostics.Process process;
        string ffmpegFileName;
        string workingDirectory;

        public Ffmpeg()
        {
            workingDirectory = Path.GetDirectoryName(Application.LocalUserAppDataPath) + @"\workingDirectory";
            ffmpegFileName = @"\ffmpeg.exe";
            if (!Directory.Exists(workingDirectory))
            {
                Directory.CreateDirectory(workingDirectory);
            }
            ffmpegFileName = workingDirectory + ffmpegFileName;
            Logger.Write("Ffmpeg Working Directory: " + ffmpegFileName);
        }

        public void Start(string pathFileName, int BitmapRate)
        {
            try
            {
                string outPath = pathFileName;
                Logger.Write("Output Video File Directory: " + outPath);
                Logger.Write("Frame Rate: " + BitmapRate.ToString());
                p = new NamedPipeServerStream(pipename, PipeDirection.Out, 1, PipeTransmissionMode.Byte);
                b = new byte[1920 * 1080 * 3]; // some buffer for the r g and b of pixels of an image of size 720p

                ProcessStartInfo psi = new ProcessStartInfo();
                psi.WindowStyle = ProcessWindowStyle.Hidden;
                psi.UseShellExecute = false;
                psi.CreateNoWindow = true;
                psi.FileName = ffmpegFileName;
                psi.WorkingDirectory = workingDirectory;

Thep roblem是安装后目录workingDirectory不包含ffmpeg.exe。因此,如果用户在安装后第一次运行程序,则文件将丢失。

我将ffmpeg.exe添加到我的项目中并将其设置为:Content and Copy always

我想做的是以某种方式将workingDirectory设置为用户安装程序的地方(如果是程序文件或任何其他目录)。

或者将workigDirectory设置为我已添加到项目中的文件ffmpeg.exe。

问题是安装后用户将运行该程序,而workingDirectory目录将为空。

3 个答案:

答案 0 :(得分:1)

如果文件ffmpeg.exe安装在调用它的程序集所在的同一目录中,那么你可以写:

string fullPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
string installDirectory = Path.GetDirectoryName( fullPath );

但是,如果您确实要将该文件从已安装的目录复制到Application.LocalUserAppDataPath

// Assuming that the LocalUserAppDataPath has already been created
string destDirectory = Path.Combine(Application.LocalUserAppDataPath, "workingDirectory");
File.Copy(Path.Combine(installDirectory, "ffmpeg.exe"), 
          Path.Combine(destDirectory, "ffmpeg.exe"), true);

但是,为什么你不搜索InnoSetup的功能来发现如何在设置过程中将ffmpeg.exe文件放在workingDirectory中?这将解决您在这里遇到的所有问题。

答案 1 :(得分:0)

您可以使用Application.StartupPath引用主要可执行文件所在的文件夹路径和ffmpeg.exe

  

<强> Application.StartupPath

     

获取启动应用程序的可执行文件的路径,   不包括可执行文件名。

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.startuppath.aspx

然后如果你需要它......将ffmpeg.exe复制到你选择的工作目录中......虽然我认为这不是一个好主意......

 File.Copy(Source, Target)

http://msdn.microsoft.com/en-us/library/c6cfw35a.aspx

string destDirectory = Path.Combine(Application.LocalUserAppDataPath, "workingDirectory");
string ffmpegDestPath = Path.Combine(destDirectory, "ffmpeg.exe");
string ffmpegSrcPath = Path.Combine(Application.StartupPath, "ffmpeg.exe");

if (!File.Exist(ffmpegDestPath)) {
     if (!Directory.Exists(destDirectory)) Directory.Create(destDirectory);
     File.Copy(ffmpegSrcPath , ffmpegDestPath );
}

答案 2 :(得分:0)

1-您应该创建一个注册表项,该注册表项可以存储应用程序所需的任何其他文件夹的安装路径和路径。请检查此问题:How to write install path to registry after install is complete with Inno setup

2-在应用程序启动时读取注册表设置。使用这些路径。