[英]During file Extraction while loop never Ends
我正在提取文檔並將所有這些數據存儲為txt文件格式。 對於提取,我使用http://www.codeproject.com/Articles/31944/Implementing-a-TextReader-to-extract-various-files此庫。 對於文檔提取,我使用以下代碼:
public static void ExtractDocument()
{
List<string> lstFiles= new List<string>();
lstFiles.Add("123.txt");
lstFiles.Add("123.doc");
lstFiles.Add("123.docx");
foreach (var fileName in lstFiles)
{
string newFileName = Path.Combine("D://extractFiles//downloadPath", fileName);
string outputFilefiname = "D://extractFiles//vij.txt";
using (var target = new FilterReader(newFileName, 0x1000))
{
target.Init();
const int blockSize = 1024;
var buffer = new Char[blockSize];
var readblockBufferSize = target.ReadBlock(buffer, 0, blockSize);
while (readblockBufferSize > 0)
{
if (buffer[0] != '\0')
{
using (var writer = new StreamWriter(outputFilefiname, true))
{
writer.Write(buffer, 0, readblockBufferSize);
}
readblockBufferSize = target.ReadBlock(buffer, 0, blockSize);
}
else
{
readblockBufferSize = readblockBufferSize - 1; --"may be due to this Line I have lost data"
}
}
}
// Write Delimete.
using (StreamWriter sWriter = new StreamWriter(outputFilefiname, true))
{
sWriter.WriteLine(string.Format("{0} 1111111111--2222222222-333333333-444444444-555555555 {0}", Environment.NewLine));
}
}
}
在此方法中,提取工作正常,但在提取過程中丟失了一些數據
else { readblockBufferSize = readblockBufferSize - 1; --"may be due to this Line I have lost data" }
但是當我使用下面的代碼進行提取時:
public static void ExtractDocument()
{
List<string> lstFiles = new List<string>();
lstFiles.Add("123.txt");
lstFiles.Add("123.doc");
lstFiles.Add("123.docx");
foreach (var fileName in lstFiles)
{
string newFileName = Path.Combine("D://extractFiles//downloadPath", fileName);
string outputFilefiname = "D://extractFiles//vij.txt";
using (var target = new FilterReader(newFileName, 0x1000))
{
target.Init();
const int blockSize = 1024;
var buffer = new Char[blockSize];
var readblockBufferSize = target.ReadBlock(buffer, 0, blockSize);
while (target.ReadBlock(buffer, 0, blockSize) > 0)
{
if (buffer[0] != '\0')
{
using (var writer = new StreamWriter(outputFilefiname, true))
{
writer.Write(buffer, 0, readblockBufferSize);
}
}
}
}
// Write Delimete.
using (StreamWriter sWriter = new StreamWriter(outputFilefiname, true))
{
sWriter.WriteLine(string.Format("{0} 1111111111--2222222222-333333333-444444444-555555555 {0}", Environment.NewLine));
}
}
}
在這種情況下,While循環永不結束(無限循環)。 我無法分析我在哪里犯錯誤。
更新方法
public ResponseOutput ExtractFile(string outputFilefiname,string downloadedFileLocation,List<string> lstfiles)
{
var responseOutput = new ResponseOutput();
responseOutput.IsSuccessful = false;
int filescount = 0;
if (!Directory.Exists(downloadedFileLocation) || string.IsNullOrWhiteSpace(downloadedFileLocation))
{
return responseOutput;
}
try
{
foreach (var fileName in lstfiles)
{
responseOutput = new ResponseOutput();
responseOutput.IsSuccessful = false;
string finalExtractedFile = Path.Combine(downloadedFileLocation, fileName);
using (var target = new FilterReader(finalExtractedFile, 0x1000))
{
target.Init();
var buffer = new Char[1024];
int blockSize = buffer.Length;
int readBlockBufferSize = 0;
while ((readBlockBufferSize = target.ReadBlock(buffer, 0, blockSize)) > 0)
{
if (buffer[0] != '\0')
{
using (var writer = new StreamWriter(outputFilefiname, true))
{
writer.Write(buffer, 0, readBlockBufferSize);
}
}
}
filescount = filescount + 1;
if (filescount != lstfiles.Count)
{
using (StreamWriter sWriter = new StreamWriter(outputFilefiname, true))
{
sWriter.WriteLine(string.Format("{0} {1} {0}", Environment.NewLine, FileSepratorDelimiter));
}
}
}
if(File.Exists(finalExtractedFile))
{
//File.Delete(finalExtractedFile);
}
}
}
catch (Exception ex)
{
//
}
return responseOutput;
}
請建議我在哪里做錯了,或者我需要怎么做才能解決此問題。
問題在於此代碼內:
var readblockBufferSize = target.ReadBlock(buffer, 0, blockSize);
while (target.ReadBlock(buffer, 0, blockSize) > 0)
{
....
}
在第一行中,您正在讀取一個塊並將其大小存儲在readBlockBufferSize
。 然后,您再次讀取(這將丟棄第一次讀取的緩沖區內容),但不會更新readBlockBuffersize
。
該代碼應如下所示:
int readBlockBufferSize = 0;
while ((readBlockBufferSize = target.ReadBlock(buffer, 0, blockSize)) > 0)
{
if (buffer[0] != '\0')
{
using (var writer = new StreamWriter(outputFilefiname, true))
{
writer.Write(buffer, 0, readblockBufferSize);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.