繁体   English   中英

DotNetZip System.UnauthorizedAccessException:拒绝访问路径

[英]DotNetZip System.UnauthorizedAccessException: Access to the path is denied

我知道这是有关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;
}

此代码从C:\\Courier\\WD目录中的域用户gfo-svc在远程服务器上运行。 每个对象实例都有其GUID,例如e1664582-1bbc-4a9f-a9fe-e7ce4a0a8a55因此zipFolder变量值为C:\\Courier\\WD\\zip-tmpTaskZipFolder值为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被禁用。

我该怎么办? 我的环境可能有什么问题? 我能做什么?

好的,这是原因:此代码在同一主机上运行两次:第一次是从cmd手动进行,第二次是从Windows Task Scheduler中进行。 默认情况下,任务计划程序从C:\\ windows \\ system32启动任务,进程无法写入其中。 但是我的代码试图相对于工作目录路径写入,因此实际上它试图写入... \\ system32 \\ tmp-dir。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM