2017-12-01 13 views
-2

그래서 파일을 읽을 때이 문제가 발생합니다.StreamReader C# 오류 : 프로세스가 파일을 사용하려고하기 때문에 액세스 할 수 없습니다.

디렉토리에서 파일 이름을 가져온 다음 db에 삽입하기 위해 반복합니다. 하지만 난 계속 오류가 발생합니다. 파일을 Streamread하려고 할 때 파일에 액세스 할 수 없습니다.

내 코드는 모두 여기에 있습니다.이 코드는이 디렉토리에서 실제로 작동하는 유일한 코드이므로 다른 프로세스가이 파일을 잠글 수 없습니다.

내가이 줄에서 오류가 계속 "을 사용하여 (VAR 리더 = 새에서는 StreamReader (localPath에))"

public async Task<ResponseBase> GetCsvAsync() 
    { 
     var response = new ResponseBase(); 
     try 
     { 
      DirectoryInfo d = new DirectoryInfo(HostingEnvironment.MapPath($"~/App_Data/IosStats/ToProcess"));//Assuming Test is your Folder 
      //FileInfo[] Files = d.GetFiles("*.csv"); //Getting Text files 
      FileInfo[] Files = d.GetFiles("*.txt"); //Getting Text files 
      var filenames = new List<string>(); 
      foreach (var file in Files) 
      { 
       filenames.Add(file.Name); 
      } 

      foreach (var filename in filenames) 
      { 
       var localPath = HostingEnvironment.MapPath($"~/App_Data/IosStats/ToProcess/{filename}"); 
       localPath = localPath ?? Path.GetFileName(filename); 
       var outputFile = System.IO.File.OpenWrite(localPath); 

       using (var reader = new StreamReader(localPath)) 
       //using (var reader = new StreamReader($"{d}/{file.Name}")) 
       { 
        var counter = 0; 
        var columnName = ""; 
        while (!reader.EndOfStream) 
        { 
         counter = counter + 1; 
         var line = reader.ReadLine(); 
         var values = line.Split(','); 
         var currentRow = new AppDownload(); 
         var currentAppHistory = DbContext.AppDownloads.Where(x => x.Platform == AppPlatform.IOS).ToList(); 
         if (counter == 5) 
         { 
          columnName = values[1]; 
         } 

         if (counter <= 4 & columnName != "") 
         { 
          var csvDate = Convert.ToDateTime(values[0]); 
          var isAlreadyLogged = currentAppHistory.Where(x => x.CsvDate == csvDate).ToList(); 
          var currentReplacementRow = new AppDownload(); 
          if (isAlreadyLogged.Count == 0) 
          { 
           currentRow.CsvDate = Convert.ToDateTime(values[0]); 
           currentRow.PackageName = "Dialdirect Insurance"; 
           currentRow.Platform = AppPlatform.IOS; 
           currentRow.InsertedTime = DateTimeOffset.Now; 
           switch (columnName) 
           { 
            case "Active Devices": 
             currentRow.ActiveDeviceInstalls = Convert.ToInt16(values[1]); 
             break; 

            case "Installations": 
             currentRow.DailyDeviceInstalls = Convert.ToInt16(values[1]); 
             break; 

            default: 
             columnName = ""; 
             break; 
           } 

           DbContext.AppDownloads.Add(currentRow); 
          } 
          else 
          { 
           currentReplacementRow = isAlreadyLogged.FirstOrDefault(x => x.CsvDate == csvDate); 
           switch (columnName) 
           { 
            case "Active Devices": 
             currentReplacementRow.ActiveDeviceInstalls = Convert.ToInt16(values[1]); 
             break; 

            case "Installations": 
             currentReplacementRow.DailyDeviceInstalls = Convert.ToInt16(values[1]); 
             break; 

            default: 
             columnName = ""; 
             break; 
           } 

           DbContext.AppDownloads.Add(currentReplacementRow); 
          } 
          await DbContext.SaveChangesAsync(); 
          var sourceFile = localPath; 
          var destinationFile = HostingEnvironment.MapPath($"~/App_Data/IosStats/Processed/{filename}"); 
          System.IO.File.Move(localPath, destinationFile); 
         } 
        } 
       } 
      } 
      response.Success = true; 
      return response; 
     } 
     catch (Exception ex) 
     { 
      ex.ToExceptionless().Submit(); 
      response.Success = false; 
      return response; 
      throw; 
     } 

    } 
이 "다른 프로세스에서 사용 중이기 때문에 프로세스가 파일 '파일 이름'에 액세스 할 수 없습니다"라는

파일을 읽지 않으므로 머리카락을 당깁니다. 어떤 도움을 받으실 수 있습니다

+2

코드를 리팩터링하면 문제가 발생할 수 있습니다. – Petaflop

답변

2

당신은 outputFile 스트림을 닫지 않고 전혀 사용하지 않는 것 같습니다. StreamReader에 의해 열려 누른 상태에서 파일을 이동

System.IO.File.Move(localPath, destinationFile); 

:

더 아래 또 다른 문제는이 라인입니다.

+0

어디에서 출력 파일 스트림을 닫을 것입니까? 파일을 스트림 리더로 읽으려고 할 때 오류가 발생합니다. –

+1

@AndreaVisnenzaAndy ** 읽기 전에 열기 전에 ** 열어서 차단되었습니다. –

+2

예,'var outputFile = System.IO.File.OpenWrite (localPath);'가 잠금 상태입니다. – Magnus

0

@Magnus가 제기 한 문제를 해결 한 후에도 쓰기 권한이 있는지에 관계없이 디렉토리 사용 권한을 확인하십시오. 그럴 경우 안티 바이러스 소프트웨어를 통해 적용되는 그룹 정책이 있는지 확인하십시오. 해당 폴더에서 해당 파일을 편집하는 것과 관련된 특정 정책이없는 경우 파일 형식에 대한 제한이 있는지 확인하십시오. 희망이 귀하의 문제를 해결합니다.