【发布时间】:2017-02-10 04:26:40
【问题描述】:
我在两种情况下使用 writer。
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);
}
在这部分中,如果它执行 else 部分,它工作正常:
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 方法代码:
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();
}
}
即使在 LocalDirectorySettings 方法中有一行带有 writer 实例的行:
writer = new FileStream(fileName, System.IO.FileMode.Create);
我正在使用一个断点,它确实到达了 LocalDirectorySettings 中的这一行,但是当它继续到该部分时:
try
{
writer.Write(readBytes, 0, currentPackageSize);
}
catch(Exception eee)
{
string myeee = eee.ToString();
}
到了 catch 部分,说 writer 为空。并且使用断点我看到 writer 为空。
为什么当它到达 LocalDirectorySettings 之后,作者是空的?
【问题讨论】: