2013-03-07 38 views
0

我正在提取文档并以txt文件格式存储所有数据。 对于提取我正在使用http://www.codeproject.com/Articles/31944/Implementing-a-TextReader-to-extract-various-files这个库。 对于文档提取我使用下面的代码:文件提取期间while循环永不结束

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 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; 
    } 

请建议我在哪里,我在做错误或我需要做来解决这个问题是什么。

+1

你为什么caling'writer.Flush(); writer.Dispose();'在'using'语句中? '使用'将继续,配置将关闭,关闭将反冲。 – 2013-03-07 08:48:40

+0

更新了我的代码,但我不认为这将是我的问题的解决方案。 – Vijjendra 2013-03-07 09:23:35

回答

0

问题在于这段代码中:

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); 
     } 
    } 
} 
+0

我曾试过,它适用于小尺寸文件,但对于长尺寸文件,而循环作为无限循环工作。 – Vijjendra 2013-03-07 10:13:40

+0

这是不可能的。循环必须结束,因为无论文件有多大,在某个点上流不会返回任何数据。我敢打赌你在你的循环中操作'readBlockBufferSize'的地方。 – 2013-03-07 11:55:28

+0

我已经更新了我的问题请看看新代码,我解压缩了9mb的文件,它卡在无限循环中。 – Vijjendra 2013-03-07 12:14:02