簡體   English   中英

在文件提取期間,while循環永不結束

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM