2016-12-27 39 views
0

私は、フォルダを解凍し、抽出されたフォルダ内のファイルをループし、データベースにデータをアップロードし、zipとファイルフォルダの両方を別のディレクトリ。私は抽出されたフォルダの移動に問題が発生しています。パスへのアクセスが拒否されました - C#Directory.Move

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

私の最初の本能は、許可の問題であるということでした。しかし、私は許可を確認し、すべてがよさそうだ。さらに、プログラム自体がディレクトリを作成するため、アクセス許可が原因であるとは思われません。

次に、インターネットを少し見て、私のuploadReportData()関数がファイルをロックしている可能性があると思っています(文を使用していますが、その間に "lag"まだロックされている)。それに応じて、私は成功しないで私のコードに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();   

     } 

Iも

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

Directory.Move(reportFolderPath, EXTRACTED_FOLDERS + folderName); 

を変更しようとしました

がエラーを受信しました。私はProcessExplorerをダウンロードして使用しようとしましたが(ここの別の答えに記載されています)、そのディレクトリにアクセスする唯一のプロセスは自分自身のプログラムです。

ご協力いただければ幸いです。

EDIT

私は長さをお詫び申し上げますが、私は問題は以下のコードにあるのかもしれない疑いがある:

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

CsvFileReaderを 'using'で使用することをお勧めします。ファイルハンドルがusing句の外にリリースされていることを確認するには' CsvFileReader reader = new CsvFileReader(children)) {...} 'のようにします。 –

答えて

1

私の勘では、あなたが/閉じるCsvFileReaderオブジェクトを配置する必要があると述べています。ファイルへのストリームは、解放するまでロックされます。

+0

あなたとアレックスJは絶対に正しいです。申し訳ありませんが、私はこの質問に答える必要がありました。私はCsvFileReaderクラスを作成しませんでした。レッスンで学んだことは、サードパーティのコードを使用する際に、正しく使用する方法を理解していることです。クラスにはまったく間違っていることは何もありません(そして、プロバイダーと他の人にそのようなコードを提供することに非常に感謝します)。私はちょうど閉じたと思ったと思います。再度、感謝します。 – KellyMarchewa

関連する問題