0

我使用 innosetup 安装我的应用程序。例如,所有文件都在 program files\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;

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

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

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

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

问题是安装后用户将运行程序并且目录workingDirectory 将为空。

4

3 回答 3

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?这将解决您在这里的所有问题。

于 2013-06-08T21:26:19.933 回答
0

1-您应该创建一个注册表项,该注册表项可以存储您的应用程序需要的任何其他文件夹的安装路径和路径。检查这个问题如何做到这一点:安装完成后如何将安装路径写入注册表

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

于 2013-06-08T21:46:42.823 回答
0

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

应用程序.启动路径

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

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 );
}
于 2013-06-08T21:30:18.420 回答