2011-12-22 5 views
1

ファイル内の最後の10行を読み込む必要があります。ファイルは約1MBですが、限られたデバイスで実行されるため、非常に効率的なコードが必要です。テキストファイルの最後の10行を読み取るにはどうすればよいですか?

PD:私はthisポストにコードをテストしましたが、誰も私のために働いていません。

EDIT Thisコードは、あなたがこれを行うには、他の方法を知っていますか、のGetStringGetByteCountを持っていないためNETMF 4.1で動作していませんか?

+0

もっと正確に何があなたにとってうまくいかないか説明できますか?エラーメッセージが表示されますか?実際の結果と期待される結果との違いはどのようなものですか? –

+2

http://stackoverflow.com/questions/452902/how-to-read-a-text-file-reverse-with-iterator-in-c-sharp/452945#452945でコードを試しましたか?ファイルのエンコーディングが何であるかを言う必要があることに注意してください。それは大きな違いになります。 –

+0

その部分を展開する必要はありません – V4Vendetta

答えて

1

これは私が最終的にどのように解決したかです。

public static string ReadEndTokens(string filename, Int64 numberOfTokens, Encoding encoding, string tokenSeparator) 
    { 
     lock (typeof(SDAccess)) 
     { 
      PersistentStorage sdPS = new PersistentStorage("SD"); 
      sdPS.MountFileSystem(); 
      string rootDirectory = VolumeInfo.GetVolumes()[0].RootDirectory; 

      int sizeOfChar = 1;//The only encoding suppourted by NETMF4.1 is UTF8 
      byte[] buffer = encoding.GetBytes(tokenSeparator); 


      using (FileStream fs = new FileStream(rootDirectory + @"\" + filename, FileMode.Open, FileAccess.ReadWrite)) 
      { 
       Int64 tokenCount = 0; 
       Int64 endPosition = fs.Length/sizeOfChar; 

       for (Int64 position = sizeOfChar; position < endPosition; position += sizeOfChar) 
       { 
        fs.Seek(-position, SeekOrigin.End); 
        fs.Read(buffer, 0, buffer.Length); 

        encoding.GetChars(buffer); 
        if (encoding.GetChars(buffer)[0].ToString() + encoding.GetChars(buffer)[1].ToString() == tokenSeparator) 
        { 
         tokenCount++; 
         if (tokenCount == numberOfTokens) 
         { 
          byte[] returnBuffer = new byte[fs.Length - fs.Position]; 
          fs.Read(returnBuffer, 0, returnBuffer.Length);       
          sdPS.UnmountFileSystem();// Unmount file system 
          sdPS.Dispose(); 
          return GetString(returnBuffer); 
         } 
        } 
       } 

       // handle case where number of tokens in file is less than numberOfTokens 
       fs.Seek(0, SeekOrigin.Begin); 
       buffer = new byte[fs.Length]; 
       fs.Read(buffer, 0, buffer.Length); 
       sdPS.UnmountFileSystem();// Unmount file system 
       sdPS.Dispose(); 
       return GetString(buffer); 
      } 
     } 
    } 

    //As GetString is not implemented in NETMF4.1 I've done this method 
    public static string GetString(byte[] bytes) 
    { 
     string cadena = ""; 
     for (int i = 0; i < bytes.Length; i++) 
      cadena += Encoding.UTF8.GetChars(bytes)[i].ToString(); 
     return cadena; 
    } 
-1

試してください:あなたのいずれかが何かアドバイスがあれば、教えてくださいので、とにかくコードが遅すぎるFile.ReadLines(myFilePathを)。 Linqを使用してください。 http://msdn.microsoft.com/en-us/library/dd383503.aspx

関連する問題