C #: добавление * содержимого * одного текстового файла в другой текстовый файл - PullRequest
12 голосов
/ 23 февраля 2011

Вероятно, нет другого способа сделать это, но есть ли способ добавить содержимое одного текстового файла в другой текстовый файл, очистив при этом первый после перемещения?

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

Спасибо!

Ответы [ 4 ]

26 голосов
/ 23 февраля 2011

Нет, я не думаю, что есть что-то, что делает это.

Если два файла используют одну и ту же кодировку, и вам не нужно проверять, что они действительны, вы можете рассматривать их как двоичные файлы, например

using (Stream input = File.OpenRead("file1.txt"))
using (Stream output = new FileStream("file2.txt", FileMode.Append,
                                      FileAccess.Write, FileShare.None))
{
    input.CopyTo(output); // Using .NET 4
}
File.Delete("file1.txt");

Обратите внимание, что если file1.txt содержит метку порядка байтов, вам следует сначала пропустить ее, чтобы избежать ее в середине file2.txt.

Если вы не используете .NET 4, вы можете написать свой собственный эквивалент Stream.CopyTo ... даже с методом расширения, чтобы сделать передачу без проблем:

public static class StreamExtensions
{
    public static void CopyTo(this Stream input, Stream output)
    {
        if (input == null)
        {
            throw new ArgumentNullException("input");
        }
        if (output == null)
        {
            throw new ArgumentNullException("output");
        }
        byte[] buffer = new byte[8192];
        int bytesRead;
        while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            output.Write(buffer, 0, bytesRead);
        }
    }
}
7 голосов
/ 23 февраля 2011

Игнорирование обработки ошибок, кодировки и эффективности на данный момент, что-то вроде этого, вероятно, будет работать (но я не проверял это)

File.AppendAllText("path/to/destination/file", File.ReadAllText("path/to/source/file"));

Затем вам нужно просто удалить или очистить первый файл после завершения этого шага.

3 голосов
/ 23 февраля 2011

cmd.exe версия этого

тип fileone.txt >> filetwo.txt

del fileone.txt

Вы можете создать системную оболочку для этого. Это должно быть довольно эффективно.

0 голосов
/ 23 февраля 2011

Я не уверен, что вы подразумеваете под "неэффективным".Ответ Джона, вероятно, достаточно для большинства случаев.Однако, если вы беспокоитесь об очень больших исходных файлах, Memory-Mapped Files может быть вашим другом.См. эту ссылку для получения дополнительной информации.

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