2016-12-27 90 views
0

我工作的一个项目,是通过提取的文件夹中的文件解压缩文件夹,循环并上传数据到数据库中,同时移动压缩和文件夹到另一个目录。我遇到了移动解压缩文件夹的问题。访问路径被拒绝 - C#Directory.Move

Message "Access to the path 'Insurance_Documents\\Test_2017' is denied." string 

我最初的直觉是它是一个权限问题。但是,我检查了许可,并且一切看起来不错;另外,当程序创建目录本身时,权限似乎并不合乎逻辑。

接下来,在环顾了一下互联网后,我想我的uploadReportData()函数可能已经锁定了文件(它确实利用了使用语句,但我认为文件可能仍然存在“滞后”仍然锁定)。作为回应,我将Thread.sleep语句放入代码中,但没有成功。该程序移动Zip文件夹就好了;这是“正常”的目录,给我带来麻烦。

的Program.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using UploadInsurance.Helpers; 

namespace UploadInsurance 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       ZipHelper.processDirectory(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message + "\n" + ex.StackTrace); 
      } 
      finally { 
       Console.Read(); 

      } 

     } 
    } 
} 

ZipHelper.cs(局部的)

 static class ZipHelper 
    { 
     private static String BASE_DIRECTORY = @"Insurance_Documents\"; 
     private static String OLD_ZIPS = @"Insurance_Documents\Old\"; 
     private static String EXTRACTED_FOLDERS = @"Insurance_Documents\Inserted\"; 

     private static List<String> zipFileList = new List<string>(); 


     private static void getZipFiles() 
     { 
      zipFileList = Directory.GetFiles(BASE_DIRECTORY, "*.zip").ToList(); 

     } 

     private static void processZipFiles() 
     { 
      String zipFolderName = ""; 
      String reportFolderName = ""; 


     foreach (String file in zipFileList) 
     { 
      folderName = Path.GetFileNameWithoutExtension(file); 
      reportFolderPath= BASE_DIRECTORY + folderName; 
      ZipFile.ExtractToDirectory(file, reportFolderPath); 

      uploadReportData(reportFolderPath);    
      Directory.Move(file, OLD_ZIPS + Path.GetFileName(file)); 
      Thread.Sleep(2000); 
      Directory.Move(reportFolderPath + "//", EXTRACTED_FOLDERS + folderName); 
     } 
    } 
... // MORE CODE HERE, INCLUDE uploadReportData function .. /// 

    public static void processDirectory() 
     { 
      ZipHelper.getZipFiles(); 
      ZipHelper.processZipFiles();   

     } 

我还试图改变

Directory.Move(reportFolderPath, EXTRACTED_FOLDERS + folderName); 

Directory.Move(reportFolderPath + "//", EXTRACTED_FOLDERS + folderName); 

但仍收到错误。我尝试下载并使用ProcessExplorer(如此处另一个答案中所述),访问该目录的唯一过程就是我的程序本身。

任何帮助将不胜感激。

编辑

我的道歉长度,但我怀疑问题可能在于下面的代码:

private static void uploadReportData(String folderPath) 
    { 
     String empFile = ""; 
     String reportFile = ""; 
     String spouseFile = ""; 
     String childrenFile = ""; 
     String beneficiaryFile = ""; 
     String visionDependentFile = ""; 

     Boolean hasEmployeeFile = false; 
     Boolean hasReportFile = false; 

     foreach (String files in Directory.GetFiles(folderPath).ToList()) 
     { 
      if (files.Contains("employee")) 
      { 
       hasEmployeeFile = true; 
       empFile = files; 
      } 

      if (files.Contains("report")) 
      { 
       hasReportFile = true; 
       reportFile = files; 
      } 

      if (files.Contains("spouse")) 
      { 
       spouseFile = files; 
      } 

      if (files.Contains("children")) 
      { 
       childrenFile = files; 
      } 

      if (files.Contains("beneficiaries")) 
      { 
       beneficiaryFile = files; 
      } 

      if (files.Contains("vision")) 
      { 
       visionDependentFile = files; 
      } 

     } 

     String employee; 
     String report; 
     String vision; 
     String beneficiary; 
     String children; 
     String spouse; 
     CsvFileReader reader; 
     try 
     { 
      using (InsuranceModel dbContext = new InsuranceModel()) 
      { 
       EmployeeReportData empData = new EmployeeReportData(); 
       Employee emp; 
       Report newReport = new Report(); 

       if (empFile != "") 
       { 
        report = reportFile; 
        employee = empFile; 
        employee.Trim(); 
        reader = new CsvFileReader(employee); 

        List<String> employees = new List<string>(); 
        while (reader.ReadRow(employees)) { } 
        String employeeID = employees[0]; 
        emp = dbContext.Employees.FirstOrDefault(em => em.EmployeeID == employeeID); 

        // see if employee exists in the database 
        if (emp == null) 
        { 
         emp = new Employee(); 
         emp.EmployeeID = employeeID; 
         emp.SSN = employees[1]; 
         emp.FirstName = employees[2]; 
         emp.LastName = employees[3]; 
         emp.DOB = Convert.ToDateTime(employees[4]); 
         dbContext.Employees.Add(emp); 
        } 

        List<String> reportList = new List<string>(); 
        reader = new CsvFileReader(report); 
        while (reader.ReadRow(reportList)) { } 

        newReport.Employee = emp; 
        newReport.EmployeeID = emp.EmployeeID; 
        newReport.Year = reportList[1]; 
        newReport.DateSubmitted = Convert.ToDateTime(reportList[2]); 
        newReport.Action = Convert.ToInt32(reportList[3]); 
        dbContext.Reports.Add(newReport); 


        // add employees year specific data regardless 

        empData.EmployeeFirst = employees[2]; 
        empData.EmployeeLast = employees[3]; 
        empData.EmployeeGender = employees[5]; 
        empData.EmployeeEmail = employees[6]; 
        empData.EmployeeStreet = employees[7]; 
        empData.EmployeeCity = employees[8]; 
        empData.EmployeeState = employees[9]; 
        empData.EmployeeZip = employees[10]; 

        String locCode = employees[11].Trim(); 
        Location loc = dbContext.Locations.First(l => l.LocationCode == locCode); 
        empData.EmployeeLocation = loc.LocationID; 
        empData.EmployeePhone = employees[12]; 
        empData.InsurancePlan = Convert.ToInt32(employees[13]); 
        empData.VisionPlan = Convert.ToInt32(employees[14]); 
        empData.Status = employees[15].Trim(); 
        empData.Report = newReport; 

        dbContext.EmployeeReportDatas.Add(empData); 

       } 

       if (childrenFile != "") 
       { 
        children = childrenFile; 

        reader = new CsvFileReader(children); 
        List<String> childrenList = new List<string>(); 

        while (reader.ReadRow(childrenList)) 
        { 
         ChildReportData newChild = new ChildReportData(); 

         newChild.Report = newReport; 
         newChild.ChildFirst = childrenList[0]; 
         newChild.ChildLast = childrenList[1]; 
         newChild.ChildDOB = Convert.ToDateTime(childrenList[2]); 
         newChild.ChildGender = childrenList[3]; 
         newChild.ChildStreet = childrenList[4]; 
         newChild.ChildCity = childrenList[5]; 
         newChild.ChildState = childrenList[6]; 
         newChild.ChildZip = childrenList[7]; 
         newChild.Step = childrenList[8]; 
         newChild.Foster = childrenList[9]; 
         newChild.Student = childrenList[10]; 
         newChild.Handicap = childrenList[11]; 
         newChild.ChildSSN = childrenList[12]; 

         dbContext.ChildReportDatas.Add(newChild); 

         childrenList.Clear(); // clear in preparation for reading a new row 

        } 


       } 

       if (spouseFile != "") 
       { 

        spouse = spouseFile; 
        reader = new CsvFileReader(spouse); 
        List<String> spouseList = new List<string>(); 

        while (reader.ReadRow(spouseList)) { } 
        SpouseReportData newSpouse = new SpouseReportData(); 

        newSpouse.Report = newReport; 
        newSpouse.SpouseSSN = spouseList[0]; 
        newSpouse.SpouseFirst = spouseList[1]; 
        newSpouse.SpouseLast = spouseList[2]; 
        newSpouse.SpouseStreet = spouseList[3]; 
        newSpouse.SpouseCity = spouseList[4]; 
        newSpouse.SpouseState = spouseList[5]; 
        newSpouse.SpouseZip = spouseList[6]; 
        newSpouse.SpouseGender = spouseList[7]; 
        newSpouse.SpouseDOB = Convert.ToDateTime(spouseList[8]); 
        newSpouse.SpouseEmployed = spouseList[9]; 

        dbContext.SpouseReportDatas.Add(newSpouse); 



       } 

       if (beneficiaryFile != "") 
       { 
        beneficiary = beneficiaryFile; 
        reader = new CsvFileReader(beneficiary); 
        List<String> beneficiaryList = new List<string>(); 

        while (reader.ReadRow(beneficiaryList)) 
        { 
         BeneficiaryReportData newBeneficiary = new BeneficiaryReportData(); 

         newBeneficiary.Report = newReport; 
         newBeneficiary.BeneficiarySSN = beneficiaryList[0]; 
         newBeneficiary.BeneficiaryFirst = beneficiaryList[1]; 
         newBeneficiary.BeneficiaryLast = beneficiaryList[2]; 
         newBeneficiary.BeneficiaryStreet = beneficiaryList[3]; 
         newBeneficiary.BeneficiaryCity = beneficiaryList[4]; 
         newBeneficiary.BeneficiaryState = beneficiaryList[5]; 
         newBeneficiary.BeneficiaryZip = beneficiaryList[6]; 
         newBeneficiary.BeneficiaryPercentage = Convert.ToDecimal(beneficiaryList[7]); 
         newBeneficiary.BeneficiaryRelationship = beneficiaryList[8]; 
         newBeneficiary.BeneficiaryType = beneficiaryList[9]; 

         dbContext.BeneficiaryReportDatas.Add(newBeneficiary); 
         beneficiaryList.Clear(); // clear in preparation for reading a new row 

        } 



       } 

       if (visionDependentFile != "") 
       { 

        vision = visionDependentFile; 
        reader = new CsvFileReader(vision); 
        List<String> visionList = new List<string>(); 

        while (reader.ReadRow(visionList)) 
        { 
         VisionDependentReportData newVision = new VisionDependentReportData(); 

         newVision.Report = newReport; 
         newVision.VisionSSN = visionList[0]; 
         newVision.VisionFirst = visionList[1]; 
         newVision.VisionLast = visionList[2]; 
         newVision.VisionDOB = Convert.ToDateTime(visionList[3]); 
         newVision.VisionGender = visionList[4]; 
         newVision.VisionRelationship = visionList[5]; 

         dbContext.VisionDependentReportDatas.Add(newVision); 
         visionList.Clear(); // clear in preparation for reading a new row 

        } 

       } 


       dbContext.SaveChanges(); 

      } 


     } 
+0

如果您运行的帐户下的程序,而是尝试创建与代码的文件夹,并手动做运动,而程序仍在运行。如果你不能手动移动它,那么你自己的程序可能会锁定一个文件或其他东西。 – CodingYoshi

+0

感谢您的建议。这确实是我的程序,但我不确定代码的哪一部分将其锁定。我会发布我的uploadReportData函数,因为我怀疑它可能是。非常感谢。 – KellyMarchewa

+1

这可能是通过'using'使用CsvFileReader,像'使用(CsvFileReader读卡器=新CsvFileReader(儿童))是一个好主意 {...}',以确保文件句柄被释放的使用条款之外。 –

回答

1

我的直觉说,你需要关闭/处置CsvFileReader对象。任何要归档的流都会锁定,直到您释放它。

+0

你和Alex J绝对正确。对不起,当答案如此明显时,我不得不问这个问题。我没有写CsvFileReader类。获得的教训 - 使用第三方代码时,请确保您了解如何正确使用它。班级绝对没有错(非常感谢提供者和所有为其他人提供此类代码的人)。我想,当“结束”声明结束时,我认为它关闭/处理了资源。再次感谢。 – KellyMarchewa