2013-07-31 4 views
1

Я хочу прочитать текстовый файл, который постоянно меняется.Прочитайте текстовый файл и обновите его с помощью C#

Но первая проблема заключается в том, что размер файла слишком велик и зависает в первый раз И каждая вторая часть этого текстового файла (txt) меняется.

Это не первый раз только последние 50 строк файла? Таким образом, программа не будет остановлена ​​

И что это легче читать и добавил постоянно меняется ...

+2

В то время как файл меняется, я думаю, что нет надежного способа прочитать файл ... –

+3

чтение файла журнала? – DevZer0

+1

Для чтения изменяющегося файла потребуется использование какой-либо опции только для чтения, а не для блокировки файла во время его использования. Аналогично, вы должны иметь возможность писать на него - если это файл журнала, он может быть использован любым приложением, записывающим журнал, и у вас могут отсутствовать разрешения на изменение. Наконец, ваш вопрос неясен - КАК вы хотите изменить файл? – Shaamaan

ответ

-1

Для асинхронного чтения текстового файла попытайтесь использовать FileHelpers библиотеки

http://filehelpers.sourceforge.net/example_async.html

+0

Решает ли проблема синхронизации при чтении и записи одновременно? Если это так, возможно, дайте нам образец этого. Нет смысла использовать туннелирование OP в lib для решения этой довольно тривиальной проблемы, если не дается никаких гарантий, что это поможет. – Gusdor

+0

Трудно сказать из вопроса, обновлен ли файл OP или каким-то другим процессом. Мне кажется, что OP пытается прочитать большой файл, что другие обновления процесса. –

1

Предполагая, что я правильно понял вас, я думаю, что вы должны время от времени открывать файл, чтобы прочитать его, а затем использовать метод Seek FileStream.

См: http://msdn.microsoft.com/en-us/library/system.io.filestream.seek.aspx

Каждый раз, когда вы читаете из файла, который вы должны сохранить местоположение до того, где вы прочитали файл. Когда вы начинаете читать другой фрагмент, вы используете это смещение с методом поиска, чтобы перейти к части файла, который вы не читали.

Таким образом, вы читаете файл в куски, не закрывая его слишком долго (и тем самым блокируя операции записи на него)

Нить (или объект Timer), то можно было прочитать из файла, время от времени. Убедитесь, что куски не слишком большие, чтобы вы не запирали файл слишком долго.

2

Watch файлы, которые вы заинтересованы в.

static class Program 
{ 
    static long position = 0; 

    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher(); 
     watcher.Path = System.Environment.CurrentDirectory; 
     watcher.NotifyFilter = NotifyFilters.LastWrite; 
     watcher.Filter = "data.txt"; // or *.txt for all .txt files. 
     watcher.Changed += new FileSystemEventHandler(OnChanged); 
     watcher.EnableRaisingEvents = true; 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 

    public static void OnChanged(object source, FileSystemEventArgs e) 
    { 
     using (FileStream fileStream = new FileStream("data.txt", FileMode.Open)) 
     { 
      // Using Ron Deijkers answer, skip to the part you din't read. 
      fileStream.Seek(position, SeekOrigin.End); 

      for (int i = 0; i < fileStream.Length; i++) 
      { 
       fileStream.ReadByte(); 
      } 
     } 
    } 
} 
0

Это, вероятно, не демонстрирует именно поток программы, что вам нужно, но это не даст вам читать и писать, что обыкновение вешать UI (асинхронный). Надеюсь, вы сможете адаптировать то, что вам нужно.

public class AsyncFileUpdate 
{ 
    object locker = new object(); 
    public FileInfo File { get; private set; } 
    public AsyncFileUpdate(FileInfo file) 
    { 
     File = file; 
    } 

    /// <summary> 
    /// Reads contents of a file asynchronously. 
    /// </summary> 
    /// <returns>A task representing the asynchronous operation</returns> 
    public Task<string> ReadFileAsync() 
    { 
     return Task.Factory.StartNew<string>(() => 
      { 
       lock (locker) 
       { 
        using (var fs = File.OpenRead()) 
        { 
         StreamReader reader = new StreamReader(fs); 
         using (reader) 
         { 
          return reader.ReadToEnd(); 
         } 
        } 
       } 
      }); 
    } 
    /// <summary> 
    /// write file asynchronously 
    /// </summary> 
    /// <param name="content">string to write</param> 
    /// <returns>A task representing the asynchronous operation</returns> 
    public Task WriteFileAsync(string content) 
    { 
     return Task.Factory.StartNew(() => 
     { 
      lock (locker) 
      { 
       using (var fs = File.OpenWrite()) 
       { 
        StreamWriter writer = new StreamWriter(fs); 
        using (writer) 
        { 
         writer.Write(content); 
         writer.Flush(); 
        } 
       } 
      } 
     }); 
    } 
} 

/// <summary> 
/// Demonstrates usage 
/// </summary> 
public class FileOperations 
{ 
    public void ProcessAndUpdateFile(FileInfo file) 
    { 
     AsyncFileUpdate fu = new AsyncFileUpdate(file); ; 
     fu.ReadFileAsync() 
      .ContinueWith(p => Process(p.Result)) 
      .ContinueWith(p => fu.WriteFileAsync(p.Result)); 
    } 

    /// <summary> 
    /// does the processing on the file content 
    /// </summary> 
    /// <param name="content"></param> 
    /// <returns></returns> 
    string Process(string content) 
    { 
     throw new NotImplementedException("you do this bit ;)"); 
    } 
} 

Все это Task бизнес от Task Parallel Library - отличный инструментарий для принятия Hastle из параллельного и асинхронного программирования. http://msdn.microsoft.com/en-us/library/dd537608.aspx

Примечание. Доступ к файловой системе довольно дорогой и физически унизительно относится к среде хранения. Вы контролируете этот файл (вы его создаете)? Обновление файла каждую секунду довольно непомерно. Если вас беспокоит изменение файла во время его изучения, возможно, вам нужно сначала сделать копию?

Смежные вопросы