2017-02-10 8 views
1

私はライターを使用している2つのケースがあります。なぜ変数FileStreamライターがnullですか?

private void downloadFile(Int32 fileNr) 
     { 
      FileStream writer = null; 
      m_currentFileSize = 0; 
      fireEventFromBgw(Event.FileDownloadAttempting); 

      FileInfo file = this.Files[fileNr]; 
      FileInfo fileFirstDateTime = this.Files[0]; 
      FileInfo fileLastDateTime = this.Files[19]; 
      Int64 size = 0; 

      Byte[] readBytes = new Byte[this.PackageSize]; 
      Int32 currentPackageSize; 
      System.Diagnostics.Stopwatch speedTimer = new System.Diagnostics.Stopwatch(); 
      Int32 readings = 0; 
      Exception exc = null; 

      if (form1.checkBox1.Text == "Download satellite images") 
      { 
       LocalDirectorySettings(file, writer); 
      } 
      else 
      { 
       writer = new FileStream(this.LocalDirectory + "\\" + file.Name, System.IO.FileMode.Create); 
      } 


      HttpWebRequest webReq; 
      HttpWebResponse webResp = null; 

      try 
      { 
       webReq = (HttpWebRequest)System.Net.WebRequest.Create(this.Files[fileNr].Path); 
       webResp = (HttpWebResponse)webReq.GetResponse(); 

       size = webResp.ContentLength; 
      } 
      catch (Exception ex) { exc = ex; } 

      m_currentFileSize = size; 
      fireEventFromBgw(Event.FileDownloadStarted); 

      if (exc != null) 
      { 
       bgwDownloader.ReportProgress((Int32)InvokeType.FileDownloadFailedRaiser, exc); 
      } 
      else 
      { 
       m_currentFileProgress = 0; 
       while (m_currentFileProgress < size && !bgwDownloader.CancellationPending) 
       { 
        while (this.IsPaused) { System.Threading.Thread.Sleep(100); } 

        speedTimer.Start(); 

        currentPackageSize = webResp.GetResponseStream().Read(readBytes, 0, this.PackageSize); 

        m_currentFileProgress += currentPackageSize; 
        m_totalProgress += currentPackageSize; 
        fireEventFromBgw(Event.ProgressChanged); 
        try 
        { 
         writer.Write(readBytes, 0, currentPackageSize); 
        } 
        catch(Exception eee) 
        { 
         string myeee = eee.ToString(); 
        } 
        readings += 1; 

        if (readings >= this.StopWatchCyclesAmount) 
        { 
         m_currentSpeed = (Int32)(this.PackageSize * StopWatchCyclesAmount * 1000/(speedTimer.ElapsedMilliseconds + 1)); 
         speedTimer.Reset(); 
         readings = 0; 
        } 
       } 

       speedTimer.Stop(); 
       writer.Close(); 
       webResp.Close(); 
       if (!bgwDownloader.CancellationPending) { fireEventFromBgw(Event.FileDownloadSucceeded); } 
      } 
      fireEventFromBgw(Event.FileDownloadStopped); 
     } 

この部分では、それは他の部分を行う場合、それは正常に動作しています:

if (form1.checkBox1.Text == "Download satellite images") 
      { 
       LocalDirectorySettings(file, writer); 
      } 
      else 
      { 
       writer = new FileStream(this.LocalDirectory + "\\" + file.Name, System.IO.FileMode.Create); 
      } 

を、それがラインをやっている場合:それは素晴らしいです:

writer = new FileStream(this.LocalDirectory + "\\" + file.Name, System.IO.FileMode.Create); 

しかし、私は変更していたら、チェックボックスをオンにして、IFの最初の部分を実行します。

LocalDirectorySettings(file, writer); 

そして、これはLocalDirectorySettingsメソッドコードです:

LocalDirectorySettingsメソッド内ライターのインスタンスを持つ行があってもという
public void LocalDirectorySettings(FileInfo file, FileStream writer) 
     { 
      try 
      { 
       var startIndex = file.Path.IndexOf("region=") + "region=".Length; 
       var length = file.Path.IndexOf("&", startIndex) - startIndex; 
       var code = file.Path.Substring(startIndex, length); 
       var countryName = form1.codeToFullNameMap[code]; 

       string firstDT = ParseDateTime(this.Files[0]); 
       string lastDT = ParseDateTime(this.Files[19]); 
       string subDirectoryDT = firstDT + "---" + lastDT; 

       string countryPath = Path.Combine(form1.mainPath, countryName); 
       LocalDirectory = countryPath + "\\" + subDirectoryDT; 

       if (!Directory.Exists(LocalDirectory)) 
       { 
        Directory.CreateDirectory(LocalDirectory); 
       } 

       string fileName = this.LocalDirectory + "\\" + "test.png"; //file.Name + "---" + countFilesNames++.ToString("D6") + ".png"; 
       writer = new FileStream(fileName, System.IO.FileMode.Create); // Set a breakpoint here. 
      } 
      catch (Exception err) 
      { 
       string ggg = err.ToString(); 
      } 
     } 

writer = new FileStream(fileName, System.IO.FileMode.Create); 

と私はブレークポイントを使用していますし、それがないとLocalDirectorySettingsこの行になったが、それは一部に継続する場合:それはキャッチ部分になってきた

try 
        { 
         writer.Write(readBytes, 0, currentPackageSize); 
        } 
        catch(Exception eee) 
        { 
         string myeee = eee.ToString(); 
        } 

は作家がnullであると言います。ブレークポイントを使うと、作者がnullであることがわかります。

なぜLocalDirectorySettingsになったら、ライターはそれの後にヌルですか?

答えて

1

LocalDirectorySettings()方法でwriterという名前のローカル変数は、呼び出し側で見つかったもwriterという名前ローカル変数、、、downloadFile()には影響を与えません。

に対してに対してこのオブジェクトを共有するためのクラスフィールドを使用することを強くお勧めします(他の回答で提案されているように)。理由はありません。そうすることでクラスが乱雑になります。代わりに、パラメータを参照渡しするか、もっと良い方法では、LocalDirectorySettings()メソッドでオブジェクトを返すだけです。例:

void downloadFile(int fileNr) 
{ 
    FileStream writer; 

    //... 

    if (form1.checkBox1.Text == "Download satellite images") 
    { 
     writer = LocalDirectorySettings(file); 
    } 
    else 
    { 
     writer = new FileStream(this.LocalDirectory + "\\" + file.Name, System.IO.FileMode.Create); 
    } 

    //... 
} 

public FileStream LocalDirectorySettings(FileInfo file) 
{ 
    try 
    { 
     //... 

     string fileName = this.LocalDirectory + "\\" + "test.png"; //file.Name + "---" + countFilesNames++.ToString("D6") + ".png"; 
     return new FileStream(fileName, System.IO.FileMode.Create); 
    } 
    catch (Exception err) 
    { 
     string ggg = err.ToString(); 
     throw; // you don't actually handle the exception, so rethrowing 
       // is the appropriate action here. Your only alternative 
       // would be to return "null" and have the caller check for 
       // that return value explicitly. 
    } 
} 
1

LocalDirectorySettingsで、FileStreamを関数パラメータに割り当てます。これは、downloadFileのwriter変数には影響しません。

writerをメンバ変数にして、2つのメソッドが共有できるようにします。パラメータを設定

FileStream writer = null; 
private void downloadFile(Int32 fileNr) 
{ 
    // Do stuff with writer 
} 

public void LocalDirectorySettings(FileInfo file) 
{ 
    // Do stuff with writer 
} 
関連する問題