Подтвердить что ты не робот

С#: добавление * содержимого * одного текстового файла в другой текстовый файл

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

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

Спасибо!

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

введите fileone.txt → filetwo.txt

del fileone.txt

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

Ответ 4

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