C# Объединение текстовых файлов

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 472
Благодарностей
575
Баллы
113
Приветствую!
Нужна функция объединение всех текстовых файлов в один по завершению шаблона.

Нашёл код в гугле на .NET 4:

Код:
using (var resultStream = new FileStream(@"d:\result.txt", FileMode.Create, FileAccess.Write, FileShare.Read))
{
    foreach (string txtPath in Directory.EnumerateFiles(@"d:\Folder", "*.txt", SearchOption.AllDirectories))
    {
        using (var txtStream = File.OpenRead(txtPath))
        {
            txtStream.CopyTo(resultStream);
        }
        resultStream.WriteByte(13); // \r
        resultStream.WriteByte(10); // \n
    }
}
Код работает, но не могу подставить переменную папки проекта. Работает если вручную прописывать путь до проекта. Но как сделать через переменные?

Пробовал:
Код:
using (var resultStream = new FileStream(@["Project.Directory\result.txt"], FileMode.Create, FileAccess.Write, FileShare.Read))
но код не выполняется.

Прошу помощи)
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
C#:
using (var resultStream = new FileStream(project.Directory + "\\result.txt", FileMode.Create, FileAccess.Write, FileShare.Read))
 

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 472
Благодарностей
575
Баллы
113
C#:
using (var resultStream = new FileStream(project.Directory + "\\result.txt", FileMode.Create, FileAccess.Write, FileShare.Read))

Пробовал разные Ваши варианты, последний вот такой и по прежнему не работает(
C#:
using (var resultStream = new FileStream(project.Variables["Project.Directory"].Value + "\\result.txt", FileMode.Create, FileAccess.Write, FileShare.Read))
{
    foreach (string txtPath in Directory.EnumerateFiles(project.Variables["Project.Directory"].Value", "*.txt", SearchOption.AllDirectories))
    {
        using (var txtStream = File.OpenRead(txtPath))
        {
            txtStream.CopyTo(resultStream);
        }
        resultStream.WriteByte(13); // \r
        resultStream.WriteByte(10); // \n
    }
}
 
  • Спасибо
Реакции: refrain

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Пробовал разные Ваши варианты, последний вот такой и по прежнему не работает
Мой точно не работает?

У вас путаница в переменных.
project - это текущий проект, именно так, не с большой буквы, а с маленькой. Directory - это свойство, текущий каталог проекта.
Вот примеры использования project.
project.Directory
project.SendInfoToLog("написать мессагу в лог", true).

project.Variables["Project.Directory"].Value
Это попытка получить путь из переменной Project.Directory, но здесь как минимум одна ошибка.
В переменных нельзя использовать символы, в данном конкретном случае точку.

Можно например так - ProjectDirectory, естественно эта переменная до этого должна быть объявлена в зенке и в ней должно что то лежать - путь.
C#:
project.Variables["ProjectDirectory"].Value
Т.е полюбому придется где то переменной ProjectDirectory присваивать какое то значение.
C#:
project.Variables["ProjectDirectory"].Value = project.Directory // положили в переменную  ProjectDirectory путь к текущей папке проекта.
Т.е по идее это лишний код, достаточно использовать project.Directory как указание к текущей папке проекта.

А чтобы не было подобных путаниц, надо стараться избегать создавать переменные, похожие на те, которые есть в зенке.

PS: для экранирования кода в виде C# используются такие теги.
 
Последнее редактирование:
  • Спасибо
Реакции: Meteorburn

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 472
Благодарностей
575
Баллы
113
Мой точно не работает?

У вас путаница в переменных.
project - это текущий проект, именно так, не с большой буквы, а с маленькой. Directory - это свойство, текущий каталог проекта.
Вот примеры использования project.
project.Directory
project.SendInfoToLog("написать мессагу в лог", true).


Это попытка получить путь из переменной Project.Directory, но здесь как минимум одна ошибка.
В переменных нельзя использовать символы, в данном конкретном случает точку.

Можно например так - ProjectDirectory, естественно эта переменная до этого должна быть объявлена в зенке и в ней должно что то лежать - путь.
C#:
project.Variables["ProjectDirectory"].Value
Т.е полюбому придется где то переменной ProjectDirectory присваивать какое то значение.
C#:
project.Variables["ProjectDirectory"].Value = project.Directory // положили в переменную  ProjectDirectory путь к текущей папке проекта.
Т.е по идее это лишний код, достаточно использовать project.Directory как указание к текущей папке проекта.

А чтобы не было подобных путаниц, надо стараться избегать создавать переменные, похожие на те, которые есть в зенке.

PS: для экранирования кода в виде C# используются такие теги.
Благодарю!
Сейчас разбил код на части и обозначил переменную или как это правильно называется и вроде с первой частью кода ОК
string directory = project.Directory

Вот эта часть выполняется и создаёт файл result.txt в папке проекта
C#:
string directory = project.Directory;
using (var resultStream = new FileStream(directory + "\\result.txt", FileMode.Create, FileAccess.Write, FileShare.Read))
Полный код не (объединение файлов) выполняется, где я допустил ошибку?
C#:
string directory = project.Directory;
using (var resultStream = new FileStream(directory + "\\result.txt", FileMode.Create, FileAccess.Write, FileShare.Read))
    {
    foreach (string txtPath in Directory.EnumerateFiles(directory + "*.txt", SearchOption.AllDirectories))
    {
        using (var txtStream = File.OpenRead(txtPath))
        {
            txtStream.CopyTo(resultStream);
        }
        resultStream.WriteByte(13); // \r
        resultStream.WriteByte(10); // \n
    }
}
За подсказку с экранизацей спасибо!
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Полный код не (объединение файлов) выполняется, где я допустил ошибку?
У вас логическая ошибка в коде.
Если простым языком, то в папке проекта создается файл result.txt, и тут же следом вы ищете все файлы по маске .txt. Под него попадает и только что созданный result.txt.
Т.е два варианта, или этот файл надо исключить, или чтобы файлы которые будут объединяться находились в каком то отдельном подкаталоге, внутри каталога проекта.

C#:
string directory = project.Directory;
using (var resultStream = new FileStream(directory + "\\result.txt", FileMode.Create, FileAccess.Write, FileShare.Read))
{
    var allFilePath = Directory
        .EnumerateFiles(directory, "*.txt", SearchOption.AllDirectories)
        .Where(p => p != directory + "\\result.txt"); // все пути, кроме пути конечного файла.
  
    foreach (string txtPath in allFilePath)
    {
        using (var txtStream = File.OpenRead(txtPath))
        {
            txtStream.CopyTo(resultStream);
        }
        resultStream.WriteByte(13); // \r
        resultStream.WriteByte(10); // \n
    }
}
 
  • Спасибо
Реакции: Meteorburn

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 472
Благодарностей
575
Баллы
113
У вас логическая ошибка в коде.
Если простым языком, то в папке проекта создается файл result.txt, и тут же следом вы ищете все файлы по маске .txt. Под него попадает и только что созданный result.txt.
Т.е два варианта, или этот файл надо исключить, или чтобы файлы которые будут объединяться находились в каком то отдельном подкаталоге, внутри каталога проекта.

C#:
string directory = project.Directory;
using (var resultStream = new FileStream(directory + "\\result.txt", FileMode.Create, FileAccess.Write, FileShare.Read))
{
    var allFilePath = Directory
        .EnumerateFiles(directory, "*.txt", SearchOption.AllDirectories)
        .Where(p => p != directory + "\\result.txt"); // все пути, кроме пути конечного файла.

    foreach (string txtPath in allFilePath)
    {
        using (var txtStream = File.OpenRead(txtPath))
        {
            txtStream.CopyTo(resultStream);
        }
        resultStream.WriteByte(13); // \r
        resultStream.WriteByte(10); // \n
    }
}
Огромное Вам спасибо!
Вы дополнительно решили то, что я хотел реализовать - "исключение". Код работает, результат получаю.

Ещё один вопрос, как теперь удалить через C# все те файлы из которых мы собирали данные и оставить только result.txt? Файл result.txt находится в той же папке, что и другие txt

Понимаю, что через
{
System.IO.File.Delete();
}
и + .Where(p => p != directory + "\\result.txt");
Но голова не варит))
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Ещё один вопрос, как теперь удалить через C# все те файлы из которых мы собирали данные и оставить только result.txt? Файл result.txt находится в той же папке, что и другие txt

Понимаю, что через
{
System.IO.File.Delete();
}
и + .Where(p => p != directory + "\\result.txt");
Но голова не варит))
В цикле удалить.

Или отдельным циклом.
C#:
string directory = project.Directory;
using (var resultStream = new FileStream(directory + "\\result.txt", FileMode.Create, FileAccess.Write, FileShare.Read))
{
    var allFilePath = Directory
        .EnumerateFiles(directory, "*.txt", SearchOption.AllDirectories)
        .Where(p => p != directory + "\\result.txt"); // все пути, кроме пути конечного файла.
   
    foreach (string txtPath in allFilePath)
    {
        using (var txtStream = File.OpenRead(txtPath))
        {
            txtStream.CopyTo(resultStream);
        }
        resultStream.WriteByte(13); // \r
        resultStream.WriteByte(10); // \n
    }
   
    foreach (string txtPath in allFilePath)
    {
        File.Delete(txtPath);
    }
}
Или сразу в цикле прохода по всем файлам.
C#:
string directory = project.Directory;
using (var resultStream = new FileStream(directory + "\\result.txt", FileMode.Create, FileAccess.Write, FileShare.Read))
{
    var allFilePath = Directory
        .EnumerateFiles(directory, "*.txt", SearchOption.AllDirectories)
        .Where(p => p != directory + "\\result.txt"); // все пути, кроме пути конечного файла.
   
    foreach (string txtPath in allFilePath)
    {
        using (var txtStream = File.OpenRead(txtPath))
        {
            txtStream.CopyTo(resultStream);
        }
        resultStream.WriteByte(13); // \r
        resultStream.WriteByte(10); // \n
     
        File.Delete(txtPath);
    }
}
Как больше нравится.:-)
 

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 472
Благодарностей
575
Баллы
113
В цикле удалить.

Или отдельным циклом.
C#:
string directory = project.Directory;
using (var resultStream = new FileStream(directory + "\\result.txt", FileMode.Create, FileAccess.Write, FileShare.Read))
{
    var allFilePath = Directory
        .EnumerateFiles(directory, "*.txt", SearchOption.AllDirectories)
        .Where(p => p != directory + "\\result.txt"); // все пути, кроме пути конечного файла.
 
    foreach (string txtPath in allFilePath)
    {
        using (var txtStream = File.OpenRead(txtPath))
        {
            txtStream.CopyTo(resultStream);
        }
        resultStream.WriteByte(13); // \r
        resultStream.WriteByte(10); // \n
    }
 
    foreach (string txtPath in allFilePath)
    {
        File.Delete(txtPath);
    }
}
Или сразу в цикле прохода по всем файлам.
C#:
string directory = project.Directory;
using (var resultStream = new FileStream(directory + "\\result.txt", FileMode.Create, FileAccess.Write, FileShare.Read))
{
    var allFilePath = Directory
        .EnumerateFiles(directory, "*.txt", SearchOption.AllDirectories)
        .Where(p => p != directory + "\\result.txt"); // все пути, кроме пути конечного файла.
 
    foreach (string txtPath in allFilePath)
    {
        using (var txtStream = File.OpenRead(txtPath))
        {
            txtStream.CopyTo(resultStream);
        }
        resultStream.WriteByte(13); // \r
        resultStream.WriteByte(10); // \n
   
        File.Delete(txtPath);
    }
}
Как больше нравится.:-)
Шикарно-шикарно!:ay::bp: Всё работает, взял вариант с удалением в цикле.

Теперь буду думать, как реализовать выполнение кода во многопоточном режиме, когда выполнение нужно лишь один раз.
 

ukrainec2014

Client
Регистрация
12.05.2017
Сообщения
351
Благодарностей
52
Баллы
28
Или сразу в цикле прохода по всем файлам.
актуально это сейчас, помоги разобраться как сделать чтобы код объединял только из определенной директории файлы и не удалял их..?
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)