Как получить пути до папки с папками внутри?

timoxa949

Client
Регистрация
16.11.2018
Сообщения
158
Благодарностей
27
Баллы
28
Привет,

Использую данный код для получения путей папок:

C#:
var names = project.Lists["names"];
System.IO.DirectoryInfo directory = new System.IO.DirectoryInfo(project.Variables["path"].Value);
foreach(System.IO.DirectoryInfo subDirectory in directory.GetDirectories())
    names.Add(subDirectory.Name);
Сделал все по интструкции, как в этой ветке: https://zennolab.com/discussion/threads/kak-sobrat-nazvanija-papok.16126/

Выдает ошибку:
Выполнение действия CSharp OwnCode. Последовательность не содержит соответствующий элемент

Что делаю неправильно? Спасибо.
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 758
Благодарностей
2 392
Баллы
113
Переменная path создана?
Список names создан?
В переменной path точно содержится путь к существующей папке?
 

timoxa949

Client
Регистрация
16.11.2018
Сообщения
158
Благодарностей
27
Баллы
28
Переменная path создана?
Список names создан?
В переменной path точно содержится путь к существующей папке?

Переменную path добавил прямой путь до папки: D:\Folder1\Subfolder
Список names создан.
В переменной path путь точный до папки
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 941
Благодарностей
4 331
Баллы
113
D:\\Folder1\\Subfolder попробуй
И сабы должны лежать в Subfolder вроде.
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 758
Благодарностей
2 392
Баллы
113
C#:
string path = "file ";// имя папки или путь - можно данные взять с переменной, например так string path = project.Variables["Имя переменной содержащей путь к папке"].Value;
path = path.Trim(); // Обрезаем пробелы если есть.
if(string.IsNullOrEmpty(path))  return ""; // Если путь пустой - завершаем работу
if(!path.Contains(':')) path = Path.Combine(project.Directory, path); // Если в переменной не содержится знак : - считаем что это имя - и формируем путь к папке рядом с шаблоном
if(!Directory.Exists(path)) Directory.CreateDirectory(path); // Создадим папку если её нет

List<string> list = new List<string>(); // временный список - здесь может быть и список Зеннопостера  IZennoList list = project.Lists["Список 1"];
DirectoryInfo dir = new DirectoryInfo(path); // Папка
string[] all_subdir = dir.GetDirectories().Select(x=>x.Name).ToArray(); // Имена подпапок
// string[] all_subdir = dir.GetDirectories().OrderBy(u => u.LastWriteTimeUtc).Select(x=>x.Name).ToArray(); // а вот так можно отсортировать по времени создания

foreach(string name in all_subdir) project.SendInfoToLog(name); // Перебираем массив - выводим подпапки в лог - строчку можно удалить если это не нужно

list.AddRange(all_subdir);// Забрасываем имена подпапок в список (может быть временный, может быть не временный
 
Последнее редактирование:
  • Спасибо
Реакции: Santorini и timoxa949

timoxa949

Client
Регистрация
16.11.2018
Сообщения
158
Благодарностей
27
Баллы
28
C#:
string path = "file ";// имя папки или путь - можно данные взять с переменной, например так string path = project.Variables["Имя переменной содержащей путь к папке"].Value;
path = path.Trim(); // Обрезаем пробелы если есть.
if(string.IsNullOrEmpty(path))  return ""; // Если путь пустой - завершаем работу
if(!path.Contains(':')) path = Path.Combine(project.Directory, path); // Если в переменной не содержится знак : - считаем что это имя - и формируем путь к папке рядом с шаблоном
if(!Directory.Exists(path)) Directory.CreateDirectory(path); // Создадим папку если её нет

List<string> list = new List<string>(); // временный список - здесь может быть и список Зеннопостера  IZennoList list = project.Lists["Список 1"];
DirectoryInfo dir = new DirectoryInfo(path); // Папка
string[] all_subdir = dir.GetDirectories().Select(x=>x.Name).ToArray(); // Имена подпапок

foreach(string name in all_subdir) project.SendInfoToLog(name); // Перебираем массив - выводим подпапки в лог - строчку можно удалить если это не нужно

list.AddRange(all_subdir);// Забрасываем имена подпапок в список (может быть временный, может быть не временный
Спасибо! Работает! Допишите пожалуйста, если не сложно. Чтобы пути папок прописывались в текстовый файл names. В C# я нулевой пока. Еще раз спасибо.
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 758
Благодарностей
2 392
Баллы
113
Допишите пожалуйста чтобы пути папок прописывались в текстовый файл names.
Вот такой код будет дописывать строчку в файл.
C#:
string path_names = "names.txt" // Имя файла
string text = "Какой-то текст..."
if(string.IsNullOrEmpty(path_names))  return ""; // выходим, если путь пустой
if(!path_names.Contains(':')) path_names  = Path.Combine(project.Directory, path_names ); // Создадим путь к файлу в папке с проектом, если на вход имя

using (var sw = new StreamWriter(path_names , true))  sw.WriteLine (text); // Дописываем текст в файл, если файла нет - создадим.
Примерно так будет откорректированный вариант согласно новых условий
C#:
// Убеждаемся в пути к файлу, куда будем сохранять имена папок
string path_names = "names.txt" // Имя файла
string text = "Какой-то текст..."
if(string.IsNullOrEmpty(path_names))  return ""; // выходим, если путь пустой
if(!path_names.Contains(':')) path_names  = Path.Combine(project.Directory, path_names ); // Создадим путь к файлу в папке с проектом, если на вход имя

// Убеждаемся что на вход идёт правильный путь к папке
string path = "file ";// имя папки или путь - можно данные взять с переменной, например так string path = project.Variables["Имя переменной содержащей путь к папке"].Value;
path = path.Trim(); // Обрезаем пробелы если есть.
if(string.IsNullOrEmpty(path))  return ""; // Если путь пустой - завершаем работу
if(!path.Contains(':')) path = Path.Combine(project.Directory, path); // Если в переменной не содержится знак : - считаем что это имя - и формируем путь к папке рядом с шаблоном
if(!Directory.Exists(path)) Directory.CreateDirectory(path); // Создадим папку если её нет

// Выбираем информацию о подпапках
DirectoryInfo dir = new DirectoryInfo(path); // Папка
string[] all_subdir = dir.GetDirectories().Select(x=>x.Name).ToArray(); // Имена подпапок

// Сохраняем имена подпапок в файл
foreach(string name in all_subdir) {
using (var sw = new StreamWriter(path_names , true))  sw.WriteLine (name); // Дописываем текст в файл, если файла нет - создадим.
}
 
Последнее редактирование:
  • Спасибо
Реакции: timoxa949

timoxa949

Client
Регистрация
16.11.2018
Сообщения
158
Благодарностей
27
Баллы
28
Вот такой код будет дописывать строчку в файл.
C#:
string path_names = "names.txt"; // Имя файла
string text = "Какой-то текст...";
if(string.IsNullOrEmpty(path_names))  return ""; // выходим, если путь пустой
if(!path_names.Contains(':')) path_names  = Path.Combine(project.Directory, path_names ); // Создадим путь к файлу в папке с проектом, если на вход имя

using (var sw = new StreamWriter(path_names , true))  sw.WriteLine (text); // Дописываем текст в файл, если файла нет - создадим.
Примерно так будет откорректированный вариант согласно новых условий
C#:
// Убеждаемся в пути к файлу, куда будем сохранять имена папок
string path_names = "names.txt"; // Имя файла
string text = "Какой-то текст...";
if(string.IsNullOrEmpty(path_names))  return ""; // выходим, если путь пустой
if(!path_names.Contains(':')) path_names  = Path.Combine(project.Directory, path_names ); // Создадим путь к файлу в папке с проектом, если на вход имя

// Убеждаемся что на вход идёт правильный путь к папке
string path = "file ";// имя папки или путь - можно данные взять с переменной, например так string path = project.Variables["Имя переменной содержащей путь к папке"].Value;
path = path.Trim(); // Обрезаем пробелы если есть.
if(string.IsNullOrEmpty(path))  return ""; // Если путь пустой - завершаем работу
if(!path.Contains(':')) path = Path.Combine(project.Directory, path); // Если в переменной не содержится знак : - считаем что это имя - и формируем путь к папке рядом с шаблоном
if(!Directory.Exists(path)) Directory.CreateDirectory(path); // Создадим папку если её нет

// Выбираем информацию о подпапках
DirectoryInfo dir = new DirectoryInfo(path); // Папка
string[] all_subdir = dir.GetDirectories().Select(x=>x.Name).ToArray(); // Имена подпапок

// Сохраняем имена подпапок в файл
foreach(string name in all_subdir) {
using (var sw = new StreamWriter(path_names , true))  sw.WriteLine (dir + "\\" + name); // Дописываем текст в файл, если файла нет - создадим.
}
Большое спасибо дорогой человек! Также исправил в коде в начале, забыли проставить точки с запятой. Также поправил, чтобы сохранялся путь, а не название папки.
 
Последнее редактирование:

BAZAg

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

Platon

Client
Регистрация
26.09.2015
Сообщения
260
Благодарностей
121
Баллы
43
чтобы сохранялся путь, а не название папки.
А я все не пойму, в названии темы "пути к папкам" а сниппет https://zennolab.com/discussion/threads/kak-sobrat-nazvanija-papok.16126/#post-99144
названия папок))
Вот только к чему весь этот огород с кодом? Если есть для этого кубик в Зеннопостер)

52841
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 758
Благодарностей
2 392
Баллы
113
А я все не пойму, в названии темы "пути к папкам" а сниппет https://zennolab.com/discussion/threads/kak-sobrat-nazvanija-papok.16126/#post-99144
названия папок))
Отличие не существенное - имя папки subDirectory.Name;
Путь к папке subDirectory.FullName;
Вот только к чему весь этот огород с кодом?
Человек задал вопрос ссылаясь на код, а не на кубик - я предположил, что и ответ ему нужен в виде кода, а не скриншота кубика.
 

Platon

Client
Регистрация
26.09.2015
Сообщения
260
Благодарностей
121
Баллы
43
Человек задал вопрос ссылаясь на код,
Юра, я не потив) К тому же знаю, что ты прямых путей не ищешь)))
Код https://zennolab.com/discussion/threads/kak-sobrat-nazvanija-papok.16126/#post-99144 тоже рабочий
Вопрос, почему он у ТС не работает)
Поменять в нем subDirectory.Name на subDirectory.FullName получится то что нужно ТС))
P.S Вопрос не к тебе был, мне просто интересно из каких побуждений люди игнорят функционал Зенки))
 

Platon

Client
Регистрация
26.09.2015
Сообщения
260
Благодарностей
121
Баллы
43
Человек задал вопрос ссылаясь на код,
Юра, я не потив) К тому же знаю, что ты прямых путей не ищешь)))
Код https://zennolab.com/discussion/threads/kak-sobrat-nazvanija-papok.16126/#post-99144 тоже рабочий
Вопрос, почему он у ТС не работает)
Поменять в нем subDirectory.Name на subDirectory.FullName получится то что нужно ТС))
P.S Вопрос не к тебе был, мне просто интересно из каких побуждений люди игнорят функционал Зенки))
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 758
Благодарностей
2 392
Баллы
113
Вопрос, почему он у ТС не работает)
Ошибка "Последовательность не содержит соответствующий элемент" на момент компиляции шаблона однозначно говорит, что в коде используется переменная либо список которые не созданы в Зеннопостере.
И совсем не гарантировано, что именно этот код вызывал проблему - вдруг там ещё какой-то кубик есть в котором ещё какой-то код находится.
Из-за чего я изначально уточнил созданы ли переменные и список, а потом набросал код, который не использует внутренние переменные и специально с обработкой того, что вдруг в переменной пусто либо вдруг на вход подалось имя папки, а не полный путь.

Поменять в нем subDirectory.Name на subDirectory.FullName получится то что нужно ТС))
Мало ли, для чего нужны пути к файлам - ведь могло быть что человеку нужны пути только для того, чтобы вытащить потом с этих путей их имена.
Просто поменять как мы уже поняли не получилось бы - для этого нужно было ещё создать в Зеннопостере переменную path и список names, и чтобы не получить исключение - ещё забросить корректный путь к папке, которая существует в переменную path.
Но, пользователь в соседней теме просил сделать так, чтобы если папка не существует - создать её - вот и превратился этот код в другой код уже с дополнительными проверками и обработкой некоторых возможных вариантов.

Очевидно - многие вещи можно сделать стандартными кубиками Зеннопостера - но, не всегда это удобнее всего (сейчас ещё нет возможности конвертировать все кубики в C#)
 

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