我知道这里有关于DotNetZip中这个错误的一些问题,我已经尝试了所有解决方案并且失败了。我正在我的Win8.1笔记本上开发代码并且没有问题,在部署到远程Win2008R2服务器后开始出现问题......
以下是问题方法:
public bool CreateZIP(string ListStep)
{
Logger logger = LogManager.GetLogger("Task:CreateZIP" + this.TaskGuid);
using (ZipFile zip = new ZipFile())
{
zip.AlternateEncoding = System.Text.Encoding.GetEncoding("cp866");
zip.AlternateEncodingUsage = Ionic.Zip.ZipOption.Always;
...
zip.AddFile(...) loop
...
zip.MaxOutputSegmentSize = Properties.Settings.Default.ZIPSizeLimit * 1024 * 1024;
string zipFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"zip-tmp");
string TaskZipFolder = Path.Combine(zipFolder, this.TaskGuid);
try
{
if (!Directory.Exists(zipFolder)) Directory.CreateDirectory(zipFolder);
if (!Directory.Exists(TaskZipFolder)) Directory.CreateDirectory(TaskZipFolder);
zip.TempFileFolder = Path.GetTempPath();
zip.Save(Path.Combine(TaskZipFolder, this.TaskGuid + @".zip"));
}
catch (Exception e)
{
logger.Fatal("Unable to save ZIP into ({0}): {1}", Path.Combine(TaskZipFolder, this.TaskGuid + @".zip"), e.ToString());
throw;
}
}
return true;
}
此代码在远程服务器上从域gfo-svc
目录中的域用户C:\Courier\WD
运行。
每个对象实例都有它的GUID,例如e1664582-1bbc-4a9f-a9fe-e7ce4a0a8a55
因此,zipFolder
变量值为C:\Courier\WD\zip-tmp
,TaskZipFolder
值为C:\Courier\WD\zip-tmp\e1664582-1bbc-4a9f-a9fe-e7ce4a0a8a55
当此代码尝试运行时,此堆栈跟踪失败:
Unable to save ZIP into (C:\Courier\WD\zip-tmp\e1664582-1bbc-4a9f-a9fe-e7ce4a0a8a55\e1664582-1bbc-4a9f-a9fe-e7ce4a0a8a55.zip): System.UnauthorizedAccessException: Access to the path is denied.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.__Error.WinIOError()
at System.IO.File.InternalMove(String sourceFileName, String destFileName, Boolean checkHost)
at Ionic.Zip.ZipSegmentedStream.TruncateBackward(UInt32 diskNumber, Int64 offset)
at Ionic.Zip.ZipEntry.Write(Stream s)
at Ionic.Zip.ZipFile.Save()
at Ionic.Zip.ZipFile.Save(String fileName)
at Worker.Task.CreateZIP(String ListStep) in Worker.cs:line 844
第844行包含以下代码:zip.Save(Path.Combine(TaskZipFolder, this.TaskGuid + @".zip"));
但是在C:\Courier\WD\zip-tmp\e1664582-1bbc-4a9f-a9fe-e7ce4a0a8a55
文件夹中我可以看到文件e1664582-1bbc-4a9f-a9fe-e7ce4a0a8a55.z01
,因此归档的第一部分在失败之前保存。
gfo-svc
用户拥有C:\Courier\WD
目录的所有权,如果该目录不存在,我的代码可以创建zip-tmp
目录,并且其中包含GUID命名的目录。所以问题不在Windows安全权限中。
此远程服务器上的UAC已禁用。
我该怎么办?我的环境可能有什么问题?我该怎么办?
答案 0 :(得分:1)
好的,原因如下: 此代码在同一主机上运行两次:第一次从cmd手动,第二次从Windows任务计划程序。 默认情况下,任务计划程序从C:\ windows \ system32启动任务,并且进程无法写入任务。但我的代码试图写入相对于工作目录路径,所以实际上它试图写入... \ system32 \ tmp-dir。