С# дописать текст в файл из переменных

Fedman09

Client
Регистрация
25.02.2020
Сообщения
92
Благодарностей
40
Баллы
28
Путь для сохранения файла: {-Project.Directory-}\download\cities\{-Variable.Gorod1-}.txt
Есть переменные с текстами:
text1
text2
text3
adres
1). Подскажите, пожалуйста, как последовательно записать тексты из переменных в файл
2). установить значение переменной adres = {-Project.Directory-}\download\cities\{-Variable.Gorod1-}.txt
3) В конце изменить TXT расширение на PHP, используя С#?
Возможно, кто-то сталкивался с подобным ранее ,без использования кубиков?

P.S. Сейчас все работает на кубиках и даёт сбои при создании файлов, в промежутке 200-1900 созданных файлов - обязательно происходит сбой.
 

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 805
Баллы
113

SHILY

Client
Регистрация
05.06.2016
Сообщения
258
Благодарностей
304
Баллы
63
Один из вариантов:
Обернул всем, чем только можно:
// Имя файла (без расширения)
var fileName = project.Variables["Gorod1"].Value;

var zennoVar = new List<ILocalVariable>();

// Добавляем наши переменные, данные из которых хотим вписать в файл (писать ".Value" не нужно)
zennoVar.Add(project.Variables["text1"]);
zennoVar.Add(project.Variables["text2"]);
zennoVar.Add(project.Variables["text3"]);

var numbVar = zennoVar.Count;

lock (CommonCode.SyncObject)
{    
    try
    {
        // Создаем экземпляр класса с информацией о нашем файле
        var file = new FileInfo($@"{project.Directory}\files\{fileName}.txt");    
        var newFile = new FileInfo($@"{file.DirectoryName}\{Path.GetFileNameWithoutExtension(file.FullName)}.php");
        
        if (newFile.Exists) throw new Exception($"Такой файл уже существует: {newFile.FullName}");
    
        // Чекаем директорию на существование, если нет, то создаем
        if (!file.Directory.Exists) file.Directory.Create();
        
        // Проверяем наличие файла и есть ли в нем строки
        if (file.Exists)
        {
            var numbLine = File.ReadAllLines(file.FullName, Encoding.UTF8).Count();
            
            if (numbLine != 0 && !string.IsNullOrEmpty(File.ReadLines(file.FullName, Encoding.UTF8).Skip(numbLine - 1).First()))
                File.AppendAllText(file.FullName, Environment.NewLine, Encoding.UTF8);
        }
        
        // Добавляем данные переменных в файл
        for (int i = 0; i < numbVar; i++)
        {
            File.AppendAllText(file.FullName, zennoVar[i].Value, Encoding.UTF8);
            
            if (i != numbVar - 1) File.AppendAllText(file.FullName, Environment.NewLine, Encoding.UTF8);
        }
        
        // Перемещаем файл с новым расширением
        File.Move(file.FullName, newFile.FullName);
    }
    catch (Exception ex)
    {
        project.SendWarningToLog($"Что-то пошло не так.. | Exception message: {ex.Message}", true);
    }
}
 
Последнее редактирование:

Fedman09

Client
Регистрация
25.02.2020
Сообщения
92
Благодарностей
40
Баллы
28
В чём заключается сбой?
Проект останавливается по ошибке. Кубик C# не может изменить расширение файла, потому что он уже существует. Непонятным образом, в рандомные моменты, проект часть текста записывает в файл (причём начало и конец текста статичны, а разные записываются части в нескольких местах, в середине) данные, сохраняет с верным названием и формирует PHP. Потом программа, неведомым образом создает аналогичный файл с другими вставленными данными (тоже верными и идущими по-порядку из одного списка) и пытается создать второй файл в папке с аналогичным названием и разширением. Так происходит сбой.

Можно решить сменой имени, но мне не подойдет такое решение. Программа, к примеру создаст 400 файлов верно, а потом выдает ошибку, либо создаст 700 файлов и сделает ошибку. Сейчас работает через пометку "необязательное действие" для создания PHP. По итогу получается около 2000 файлов созданных и примерно 8-12 ошибочных файлом в TXT формате, с недописанными в соответствующие файлы PHP данными.
 

Fedman09

Client
Регистрация
25.02.2020
Сообщения
92
Благодарностей
40
Баллы
28
В чём заключается сбой?
Данное решение пришлось создать, потому что зенопостер, в предыдущей версии, которая работала с движком Google, при создании кнопок не писала первую букву в слове, также рандомно, как сейчас ошибки с файлами. А без первой буквы, название на кнопках - это не айс.
 

Fedman09

Client
Регистрация
25.02.2020
Сообщения
92
Благодарностей
40
Баллы
28
Один из вариантов:
Обернул всем, чем только можно:
// Имя файла (без расширения)
var fileName = project.Variables["Gorod1"].Value;

var zennoVar = new List<ILocalVariable>();

// Добавляем наши переменные, данные из которых хотим вписать в файл (писать ".Value" не нужно)
zennoVar.Add(project.Variables["text1"]);
zennoVar.Add(project.Variables["text2"]);
zennoVar.Add(project.Variables["text3"]);

var numbVar = zennoVar.Count;

lock (CommonCode.SyncObject)
{   
    try
    {
        // Создаем экземпляр класса с информацией о нашем файле
        var file = new FileInfo($@"{project.Directory}\files\{fileName}.txt");   
        var newFile = new FileInfo($@"{file.DirectoryName}\{Path.GetFileNameWithoutExtension(file.FullName)}.php");
       
        if (newFile.Exists) throw new Exception($"Такой файл уже существует: {newFile.FullName}");
   
        // Чекаем директорию на существование, если нет, то создаем
        if (!file.Directory.Exists) file.Directory.Create();
       
        // Проверяем наличие файла и есть ли в нем строки
        if (file.Exists)
        {
            var numbLine = File.ReadAllLines(file.FullName, Encoding.UTF8).Count();
           
            if (numbLine != 0 && !string.IsNullOrEmpty(File.ReadLines(file.FullName, Encoding.UTF8).Skip(numbLine - 1).First()))
                File.AppendAllText(file.FullName, Environment.NewLine, Encoding.UTF8);
        }
       
        // Добавляем данные переменных в файл
        for (int i = 0; i < numbVar; i++)
        {
            File.AppendAllText(file.FullName, zennoVar[i].Value, Encoding.UTF8);
           
            if (i != numbVar - 1) File.AppendAllText(file.FullName, Environment.NewLine, Encoding.UTF8);
        }
       
        // Перемещаем файл с новым расширением
        File.Move(file.FullName, newFile.FullName);
    }
    catch (Exception ex)
    {
        project.SendWarningToLog($"Что-то пошло не так.. | Exception message: {ex.Message}", true);
    }
}
Сейчас проверю и отпишусь
 

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 805
Баллы
113
Могу и ошибаться, но мне кажется что в обоих описанных случаях проблема не в ZennoPoster, а где-то в логике проекта.
 

Fedman09

Client
Регистрация
25.02.2020
Сообщения
92
Благодарностей
40
Баллы
28
Один из вариантов:
Обернул всем, чем только можно:
// Имя файла (без расширения)
var fileName = project.Variables["Gorod1"].Value;

var zennoVar = new List<ILocalVariable>();

// Добавляем наши переменные, данные из которых хотим вписать в файл (писать ".Value" не нужно)
zennoVar.Add(project.Variables["text1"]);
zennoVar.Add(project.Variables["text2"]);
zennoVar.Add(project.Variables["text3"]);

var numbVar = zennoVar.Count;

lock (CommonCode.SyncObject)
{   
    try
    {
        // Создаем экземпляр класса с информацией о нашем файле
        var file = new FileInfo($@"{project.Directory}\files\{fileName}.txt");   
        var newFile = new FileInfo($@"{file.DirectoryName}\{Path.GetFileNameWithoutExtension(file.FullName)}.php");
       
        if (newFile.Exists) throw new Exception($"Такой файл уже существует: {newFile.FullName}");
   
        // Чекаем директорию на существование, если нет, то создаем
        if (!file.Directory.Exists) file.Directory.Create();
       
        // Проверяем наличие файла и есть ли в нем строки
        if (file.Exists)
        {
            var numbLine = File.ReadAllLines(file.FullName, Encoding.UTF8).Count();
           
            if (numbLine != 0 && !string.IsNullOrEmpty(File.ReadLines(file.FullName, Encoding.UTF8).Skip(numbLine - 1).First()))
                File.AppendAllText(file.FullName, Environment.NewLine, Encoding.UTF8);
        }
       
        // Добавляем данные переменных в файл
        for (int i = 0; i < numbVar; i++)
        {
            File.AppendAllText(file.FullName, zennoVar[i].Value, Encoding.UTF8);
           
            if (i != numbVar - 1) File.AppendAllText(file.FullName, Environment.NewLine, Encoding.UTF8);
        }
       
        // Перемещаем файл с новым расширением
        File.Move(file.FullName, newFile.FullName);
    }
    catch (Exception ex)
    {
        project.SendWarningToLog($"Что-то пошло не так.. | Exception message: {ex.Message}", true);
    }
}

Пытаюсь применить Ваше решение в проекте. Получилось несколько кубиков С#, но не работают. Прикрепил данную часть проекта. Возможно, это поможет разобраться?
 

Вложения

Fedman09

Client
Регистрация
25.02.2020
Сообщения
92
Благодарностей
40
Баллы
28

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 805
Баллы
113
С большой долей вероятности проблема в двух C# экшенах, которые берут строки из списка - нет блокировки списка при взятии и удалении строк. Замените их на стандартные экшены взятия строк из списка.

Это к делу не относится, но... первые 5 экшенов у Вас пишут текст из переменных в один и тот же файл. Можно их заменить одним экшеном:
77451
 
  • Спасибо
Реакции: Fedman09

Fedman09

Client
Регистрация
25.02.2020
Сообщения
92
Благодарностей
40
Баллы
28
С большой долей вероятности проблема в двух C# экшенах, которые берут строки из списка - нет блокировки списка при взятии и удалении строк. Замените их на стандартные экшены взятия строк из списка.

Это к делу не относится, но... первые 5 экшенов у Вас пишут текст из переменных в один и тот же файл. Можно их заменить одним экшеном:
Точно! Не подумал об этом, благодарю за подсказку. А в отношении "замены" на стандартный, сейчас проэкспериментирую
 

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