2017-12-01 18 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ストリームを閉じておらず、まったく使用していないようです。さらに下

もう一つの問題は、この行です:

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

StreamReaderことによってそれをオープンに保持しながら、あなたは、ファイルを移動しています。

+0

出力ファイルストリームをどこで閉じるか。ストリームリーダにファイルを読み込もうとしたときにエラーが発生します。 –

+1

@AndreaVisnenzaAndy読み込みのために**開かれる前に**開封していますので、ブロックされています。 –

+2

はい、 'var outputFile = System.IO.File.OpenWrite(localPath);'はロックしています。 – Magnus

0

@Magnusで発生した問題を修正した後でも、書き込み権限があるかどうかにかかわらず、ディレクトリのアクセス許可を確認してください。もし持っていれば、アンチウィルスソフトウェアを介して実施されているグループポリシーがあるかどうかを確認してください。そのフォルダにそのファイルを編集するためのポリシーがない場合は、ファイルの種類に制限があるかどうかを確認してください。これがあなたの問題を解決することを願っています。

関連する問題