Soru Kuyrukta olduğu gibi sonunda başlayan bir dosyadan oku


Yerel C # 'de, bir dosyanın sonundan nasıl okuyabilirim?

Bu geçerli çünkü bir günlük dosyasını okumam gerekiyor ve son 3 satırı okumak için 10k'yı okumak mantıklı değil.


32
2017-12-06 16:52


Menşei


10KB o kadar değil :) - Hamish Grubijan
Windows için bir yardımcı programa ihtiyacınız varsa, gerçekten iyi çalışıyor dikkati çekiyor. - cfeduke
@cfeduke Bir uygulamadaki son satırı yeniden düzenlemeye ihtiyacınız var. Yine de teşekkürler. - C. Ross
Ayrıca bakınız: Son 10 satırlık çok geniş metin dosyası alın> 10GB c #, C # içinde yineleyici ile tersine bir metin dosyası nasıl okunur - hippietrail


Cevaplar:


Son 1024 baytı okumak için:

using (var reader = new StreamReader("foo.txt"))
{
    if (reader.BaseStream.Length > 1024)
    {
        reader.BaseStream.Seek(-1024, SeekOrigin.End);
    }
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        Console.WriteLine(line);
    }
}

45
2017-12-06 16:59



Her zamanki gibi mükemmel cevap, teşekkürler Darin. - C. Ross
Bu, bir karakteri kodlamak için çoklu bayt kullanabilen karakter kümeleriyle (UTF-8 gibi) çalışır mı? Görünüşe göre, çok baytlı bir dizinin ortasından başlayabilirsiniz. - Eric J.
Ne demek istediğimi test etmelisiniz, ancak eğer string'inin karakter boyutunu (UTF8 için 2 bayt) biliyorsanız ve bu sayı ile bölünebilen bir ara ofset kullanırsanız meli Bir karakterin ortasında bir şey okumamı engeller. Bir akışın hiçbir zaman bir dosya döndürdüğünü göremedim, ancak dosya içeriği (yani hiç bir zaman dosya isminin bir sonu ya da dosyanın bir parçası olmayan diğer karakterler). - Andrew Bonsall
Bu benim için son satırı tam olarak okumamıştı, fakat bunun yerine bir dizi satırı okudu. - Bassie


Belki böyle bir şey senin için çalışacaktır:

using (var fs = File.OpenRead(filePath))
{
    fs.Seek(0, SeekOrigin.End);

    int newLines = 0;
    while (newLines < 3)
    {
        fs.Seek(-1, SeekOrigin.Current);
        newLines += fs.ReadByte() == 13 ? 1 : 0; // look for \r
        fs.Seek(-1, SeekOrigin.Current);
    }

    byte[] data = new byte[fs.Length - fs.Position];
    fs.Read(data, 0, data.Length);
}

Bu varsayımları dikkate alınız. \r\n.


9
2017-12-06 16:58



Şüphe ile bu soruya formüle edilirse: stackoverflow.com/questions/4369278/... - VVS
+1 Hattın nasıl taranabileceğini göstermek için. Yan not: kontrol ediliyor 13 byte-by-byte ASCII / UTF8 kodlamasını kabul eder. Dosyanın hangi kodlamasını yazdığını bilmiyorsanız bu doğru çalışmayabilir. - Alexei Levenkov


Aşağıdaki kod rasgele erişim kullanmaktadır FileStream tohum için StreamReader Dosyanın sonuna yakın bir yerde, ilk okuma satırını atmak büyük olasılıkla sadece kısmidir.

FileStream stream = new FileStream(@"c:\temp\build.txt", 
    FileMode.Open, FileAccess.Read);

stream.Seek(-1024, SeekOrigin.End);     // rewind enough for > 1 line

StreamReader reader = new StreamReader(stream);
reader.ReadLine();      // discard partial line

while (!reader.EndOfStream)
{
    string nextLine = reader.ReadLine();
    Console.WriteLine(nextLine);
}

3
2017-12-06 17:05





Şuna bir bak ilgili sorunun cevabı okumak için Metin dosyası geri viteste. Geriye doğru bir dosya okumak için çok fazla karmaşıklık var. doğru şekilde.


-1
2018-05-30 21:24



Neden reddedildim? - Elaskanator