这几天在做一个网站的用户下载历史数据的功能,用户下载时服务器上的程序利用process.start()启动WinRAR.exe执行压缩命令,然后在将压缩包传给客户端。
在本地模拟时一切正常,可以完成下载,放到服务器时WinRAR.exe也正常启动了,可以在任务管理器上看到WinRAR.exe的进程,但没有成功完成压缩指令,也就是没有正常生成压缩文件,代码如下:
public void compress(out bool bo, out TimeSpan times)
{bo = false;
//压缩文件
string yasuoPathSave = "C:/test.rar";
string yasuoPath = "C:/test";
System.Diagnostics.Process pro = new System.Diagnostics.Process();
pro.StartInfo.FileName = "C:\Program Files\WinRAR\WinRAR.exe";//WinRAR.exe所在路径
pro.StartInfo.Arguments = string.Format("a {0} {1} -r",yasuoPathSave,yasuoPath);
pro.Start();
times = pro.TotalProcessorTime;
bo = pro.WaitForExit(60000);//设定一分钟
if (!bo)
pro.Kill();
pro.Close();
pro.Dispose();
return;
}
网上找了好久也没有找到办法,最后突发灵感,可能和权限有关然后修改代码如下:
public void compress(out bool bo, out TimeSpan times)
{if(!System.IO.Directory.Exists("C:/temp"))
{
System.IO.Directory.CreateDirectory("C:/temp");
}
bo = false;
//压缩文件
string yasuoPathSave = "C:/temp/test.rar";
string yasuoPath = "C:/test";
System.Diagnostics.Process pro = new System.Diagnostics.Process();
pro.StartInfo.FileName = "C:\Program Files\WinRAR\WinRAR.exe";//WinRAR.exe所在路径
pro.StartInfo.Arguments = string.Format("a {0} {1} -r",yasuoPathSave,yasuoPath);
pro.Start();
times = pro.TotalProcessorTime;
bo = pro.WaitForExit(60000);//设定一分钟
if (!bo)
pro.Kill();
pro.Close();
pro.Dispose();
return;
}
也就是将生成的rar文件不直接放到C盘下,而是放到C盘下的某一路径下,这样就避免了程序无法在根目录下直接写入文件的权限问题。后来又找到另一个办法,就是给权限,操作如下:
Windows 系统->运行->regedit->HKEY_LOCAL_MACHINE->SOFTWARE->Microsoft->Windows->CurrentVersion->Policies->System->EnableLUA将其值修改为0->重启云主机。
但这种办法可能会使云主机安全性降低,带来隐患,不过只是猜测。