2016-12-27 3 views
0

Ich arbeite an einem Projekt, das zum Entpacken von Ordnern ist, durchlaufen die Dateien in den extrahierten Ordnern und hochgeladene Daten in eine Datenbank, und verschieben Sie die Zip-und Dateiordner in ein anderes Verzeichnis . Ich habe Probleme beim Verschieben des extrahierten Ordners.Zugriff auf Pfad verweigert - C# Directory.Move

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

Mein erster Instinkt war, dass es ein Erlaubnisproblem war. Allerdings habe ich die Erlaubnis überprüft und alles sieht gut aus; Außerdem, da das Programm das Verzeichnis selbst erstellt, erscheint es nicht sehr logisch, dass Berechtigungen die Ursache sind.

Als nächstes, nachdem ich mich im Internet ein wenig angesehen habe, dachte ich, meine uploadReportData() Funktion hätte die Dateien gesperrt (es nutzt Anweisungen), aber ich dachte, es könnte noch eine "Verzögerung" geben, während der die Dateien waren immer noch abgeschlossen). Als Antwort habe ich die Thread.sleep-Anweisung ohne Erfolg in meinen Code eingefügt. Das Programm verschiebt den Zip-Ordner problemlos; Es ist das "normale" Verzeichnis, das mir Probleme bereitet.

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 (teilweise)

 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();   

     } 

Ich habe auch versucht

Ändern
Directory.Move(reportFolderPath, EXTRACTED_FOLDERS + folderName); 

zu

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

aber immer noch den Fehler erhalten. Ich habe versucht, ProcessExplorer herunterzuladen und zu verwenden (wie in einer anderen Antwort hier erwähnt), und der einzige Prozess, der auf dieses Verzeichnis zugreift, ist mein Programm selbst.

Jede Hilfe würde sehr geschätzt werden.

EDIT

ich für die Länge entschuldigen, aber ich vermute, dass das Problem in dem unten stehenden Code liegen:

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

Wenn Sie das Programm unter Ihrem Konto ausführen, erstellen Sie einfach den Ordner mit Code und führen Sie die Verschiebung manuell aus, während das Programm noch ausgeführt wird. Wenn Sie es nicht manuell verschieben können, sperrt möglicherweise Ihr eigenes Programm eine Datei oder etwas. – CodingYoshi

+0

Danke für den Hinweis. Es ist in der Tat mein Programm, aber ich bin nur nicht sicher, welcher Teil des Codes es blockiert. Ich werde meine uploadReportData-Funktion posten, da ich vermute, dass dies der Fall sein könnte. Vielen Dank. – KellyMarchewa

+1

Es könnte eine gute Idee sein, CsvFileReader über 'using' zu verwenden, wie' using (CsvFileReader reader = new CsvFileReader (children)) {...} 'um sicher zu sein, dass das Datei-Handle außerhalb der using-Klausel freigegeben wird. –

Antwort

1

Meine Vermutung sagt, dass Sie/schließen müssen das CsvFileReader Objekt entsorgen. Jeder Stream in Datei wird gesperrt, bis Sie ihn freigeben.

+0

Sie und Alex J waren absolut richtig. Es tut mir leid, dass ich diese Frage stellen musste, als die Antwort so offensichtlich war. Ich habe die CsvFileReader-Klasse nicht geschrieben. Lektion gelernt - Wenn Sie Code von Drittanbietern verwenden, vergewissern Sie sich, dass Sie verstehen, wie Sie ihn richtig verwenden. Es ist absolut nichts falsch mit der Klasse (und vielen Dank an den Anbieter und alle, die solchen Code für andere verfügbar machen). Ich nehme an, ich dachte nur, dass es seinen Ressourcenverbrauch geschlossen hat, als die "mit" Aussage endete. Danke noch einmal. – KellyMarchewa

Verwandte Themen