Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
3 / 3 / 2
Регистрация: 21.10.2013
Сообщений: 225

Сортировка списка файлов по времени, по имени

13.09.2015, 23:04. Показов 6869. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
есть папка с файлами:

Файлы - это массивы снимаемые с прибора (потом дальше пойдут в обработку, соответственно надо как-то их отсортировать в списке, иначе при обработке не отследишь):
0-Х - нулевые сигналы прибора;
Х - положительное измерение прибора;
-Х - отрицательное измерение прибора.

Вообще хочу отсортировать следующим образом:
сначала файлы 0-Х, затем файлы от min(-9) значения(с ростом)---> до max значение(9).
или же допустим так сформировать список файлов:
сначала 0-Х, потом отрицательные (от -0.01 до -9), затем записываются положительные(0.01->9).

сейчас пока получил весь список файлов, отсортированных по времени:
C#
1
2
3
4
5
              
 foreach (FileInfo file in dir.GetFiles("*.txt").OrderBy(f=>f.LastWriteTime).ToList())
               {
                   files.Add(Path.GetFullPath(file.FullName));
               }
Вроде прогоняю работает нормально. Но как оказалось если массивы созданы в одну минуту, то сортировка не пашет((
например создадим в папке файл a.txt, тут же скопируем его и вставим, получив a-копия.txt.
При прогоне получим, что а-копия.txt на первом месте в списке хотя создавался вторым, а а.txt - на 2 хотя создавался первым.

Теперь пробую получить список по имени, но если честно не втыкаю, как запихнуть 0-Х файлы вначале, а уж потом остальные от минимального значения к максимальному.
C#
1
files = files.OrderBy(s => Double.Parse(Path.GetFileNameWithoutExtension(s))).ToList();
но на значениях 0-Х.txt происходит исключение типа:


Если нужны ещё какая информация скажите.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.09.2015, 23:04
Ответы с готовыми решениями:

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

Сортировка списка файлов по расширение, затем по имени
у меня вот такая задачка: нужно рассортировать массив, который состоит из названия файлов. Сначала по-расширению, потом в алфавитном...

Сортировка файлов по части имени
День добрый! Список файлов в папке: 5555-001-123.txt 5555-005-121.txt 5555-007-153.txt 5555-009-018.txt Надо...

8
3 / 3 / 2
Регистрация: 21.10.2013
Сообщений: 225
13.09.2015, 23:08  [ТС]
вот так вот
0
 Аватар для Zhavoronkov5
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
13.09.2015, 23:58
Правьте список с именами файлов при помощи регулярных выражений. Например, отсортировать, отбросив "0-" из каждой строки можно вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
            //  Исходный список
            List<string> fileNames = new List<string>
            {
                "0-0,03",   //  на этой строке выбрасывалось исключение.
                "0,01", //  это обычный double (разделитель - запятая, иначе Double.Parse тупит.
                "1",
                "2"
            };
 
            //  Сортируем список по значению. Если в названии есть "0-", отбрасываем его
            List<string> output = fileNames.OrderBy(
                
                name => Double.Parse(
                    
                    Regex.Replace(name,@"0-",String.Empty)
                
                )).ToList();
P.S. заставить Double.Parse понимать точку можно, надо какую-то длинную фразу написать. Что-то про глобализацию, сейчас уже поздно искать.
1
3 / 3 / 2
Регистрация: 21.10.2013
Сообщений: 225
14.09.2015, 00:08  [ТС]
Спс. Насчёт ., знаю.
Значит про регулярные выражения надо почитать.
Ещё раз спс.
0
3 / 3 / 2
Регистрация: 21.10.2013
Сообщений: 225
18.09.2015, 12:04  [ТС]
Здравствуйте ещё раз!
Простите, только сейчас вернулся к своей задаче((Начальство мозг "ломает" другими "приоритетными" задачами((
Итак. файлы с именем, начинающимся на 0- нельзя выкидывать!!!
Всего в папке 66 файлов. 22 начинаются с "0-**.txt", 22 с "-**.txt" и 22 просто "**.txt".
**.txt в названии содержат от -240 до 240, включая пару названий с +- 0.01,0.02,0.03 и т.д.

То, что я хочу сделать, чтобы сначала в список файлов внеслись все файлы содержащие "0-", в порядке от 0.01 до 240.
Затем все файлы с "-**.txt" в порядке -0,01=>-240 и следом, последние 22 файла, также отсортированные от 0.01 до 240.
Как я понимаю в Linq не впихнуть условие IF(){}.
Сейчас пока получил список всех файлов с "0-", "-" и остальных, а вот как отсортировать? Да так чтобы потом к ним можно было обращаться не втыкаю.

PS Вы уж простите, что с таким запозданием рассматриваю Ваши ответы.

Добавлено через 13 минут
ойёй

Добавлено через 4 минуты
вот так я отсортировал, по наличию 0-, - и остальные:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
                foreach (FileInfo file in Dir.GetFiles("*.txt"))
                {
                    if (file.Name.Contains("0-"))
                    {
                        Files.Add(Path.GetFullPath(file.FullName));
                    }
                    if (!file.Name.Contains("0-")&&file.Name.Contains("-"))
                    {
                        Files2.Add(Path.GetFullPath(file.FullName));
                    }
                    if (!file.Name.Contains("-"))
                    {
                        Files3.Add(Path.GetFullPath(file.FullName));
                    }
                }
                Files2.AddRange(Files3);
                Files.AddRange(Files2);
Добавлено через 1 минуту
Конкретно не втыкаю, как запихнуть в orderBy условие:
такое чтобы сначала шли 0- , - и остальные потом, и чтобы к тому же сортировалось по значению.

Добавлено через 16 секунд
Заранее спс!
0
 Аватар для Zhavoronkov5
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
18.09.2015, 12:11
Лямбды - не какой-то волшебный язык, а такой же код, как и обычный. Просто более простой в записи и оптимизированный как раз для поиска, сортировки и т.п. Читайте теорию, например, Троелсена, как приходить от обычного кода к лямдам.

If в лямбды легко запихивается. Вашу задачу я решил бы, например, вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
            //  Исходный список, который нужно отсортировать.
            List<string> fileNames = new List<string>
            {
                "0-0,01",   //  --> 1
                "0,01",     //  --> 3
                "0-0,03",   //  --> 2
                "1",        //  --> 4
                "2"         //  --> 5
            };
 
            //  Сортируем список по значению. Если в названии есть "0-", отбрасываем его и преобразуем остаток в Double.
            //  Если в названии нет "0-", то преобразуется в Double, затем к нему прибавляется 100500 - такие всегда будут в конце.
            List<string> output = fileNames.OrderBy(
 
                name => 
                {
                    if (name.Contains("0-")) 
                        return Double.Parse(
                            Regex.Replace(name, @"0-", String.Empty));
                    else 
                        return (Double.Parse(name) + 100500);
                }
 
                ).ToList();
Намного короче, и самое главное, нагляднее, чем куча if-ов. Хотя медленнее. После того, как овладеете, на циклы и if-ы смотреть не станете.
1
3 / 3 / 2
Регистрация: 21.10.2013
Сообщений: 225
18.09.2015, 14:46  [ТС]
Выскакивает, неверный тип данных(((
Попробовал с добавлениями и просто без 100500, одно и тоже
Вложение 575499
пробовал так и сяк
C#
1
2
3
return (Double.Parse(name));
return (Double.Parse(name, CultureInfo.InvariantCulture) + 100500);
return (Double.Parse(name) + 100500);
Добавлено через 36 минут
кажись понял, вы обрабатываете фактически только имя файла, а не весь путь.
Я же, потом когда отсортирую по названию, буду читать эти файлы в массив в очерёдности, которую задам списком файлов. Соответственно, когда буду работать с массивом, все столбцы будут на своих местах.

Добавлено через 1 минуту
Или когда мы говорим"name" мы и имеем в виду file.name????

Добавлено через 1 час 9 минут
Сейчас попробовал изменить вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
              
foreach (FileInfo file in Dir.GetFiles("*.txt"))
                {
                //        Files.Add(Path.GetFullPath(file.FullName));
                        Files2.Add(file.Name);
 List<string> output = Files2.OrderBy(
                name =>
                {
                    if (name.Contains("0-"))
                        return Double.Parse(
                            Regex.Replace(Regex.Replace(name,@".txt",String.Empty), @"0-", String.Empty));
                    else
                        return (Double.Parse(Regex.Replace(name,@".txt",""))+100500);
                }
 
                ).ToList();
Я попробовал вашим методом избавиться от текста(.txt) в названии и всё равно((( тоже исключение(((

Добавлено через 2 минуты
при прочтении первого из списка файла точнее его имени и расширения, видимо ругается именно на расширение, вот(( и как расширение выкинуть? Попробовал вместо replase -> split, однако он не принимает строку как separator.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
18.09.2015, 15:12
Лучший ответ Сообщение было отмечено ToLexx как решение

Решение

Цитата Сообщение от ToLexx Посмотреть сообщение
Всего в папке 66 файлов. 22 начинаются с "0-**.txt", 22 с "-**.txt" и 22 просто "**.txt".
**.txt в названии содержат от -240 до 240, включая пару названий с +- 0.01,0.02,0.03 и т.д.
То, что я хочу сделать, чтобы сначала в список файлов внеслись все файлы содержащие "0-", в порядке от 0.01 до 240.
Затем все файлы с "-**.txt" в порядке -0,01=>-240 и следом, последние 22 файла, также отсортированные от 0.01 до 240.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
 
namespace ConsoleApplication198
{
    class Program
    {
        static void Main(string[] args)
        {
            //создаем файлы
            Directory.CreateDirectory("temp");
            File.CreateText("temp\\0-0.1.txt");
            File.CreateText("temp\\-0.1.txt");
            File.CreateText("temp\\6.2.txt");
            File.CreateText("temp\\1.txt");
            File.CreateText("temp\\-0.2.txt");
            File.CreateText("temp\\0-6.txt");
 
            //создаем список
            var list = new List<FileDesc>();
            foreach (var file in Directory.GetFiles("temp\\"))
                list.Add(new FileDesc(file));
 
            //сортируем
            list.Sort();
 
            //выводим
            foreach (var file in list)
                Console.WriteLine(file.FilePath);
 
            Console.ReadLine();
        }
    }
 
    class FileDesc : IComparable<FileDesc>
    {
        private FileType type;
        private DateTime fileDate;
        private float num;
        public string FilePath { get; private set; }
 
        public FileDesc(string fullFilePath)
        {
            FilePath = fullFilePath;
            var name = Path.GetFileNameWithoutExtension(fullFilePath);
            if (name.StartsWith("0-")) type = FileType.Zero; else
            if (name.StartsWith("-")) type = FileType.Negative; else type = FileType.Positive;
            if (type != FileType.Positive)
                name = name.Split('-')[1];
 
            num = float.Parse(name, CultureInfo.InvariantCulture);
            fileDate = File.GetCreationTime(fullFilePath);
        }
 
        public int CompareTo(FileDesc other)
        {
            var res = type.CompareTo(other.type);
            if (res == 0)
                res = num.CompareTo(other.num);
 
            return res;
        }
    }
 
    enum FileType
    {
        Zero, //0-**
        Negative, //-**
        Positive // **
    }
}
1
 Аватар для Zhavoronkov5
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
18.09.2015, 23:02
Цитата Сообщение от ToLexx Посмотреть сообщение
и как расширение выкинуть?
Все уже под капотом:
C#
1
string str = Path.GetFileNameWithoutExtension(openFileDialog.FileName);
Специально весь день не отвечал, наблюдал, как начинаете самостоятельно разбираться в коде. Все у Вас получится.

Добавлено через 2 минуты
Storm23, а зачем такое активное использование var?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.09.2015, 23:02
Помогаю со студенческими работами здесь

Сортировка файлов по папкам в EXCEL по имени ячейки
Добрый день! Помогите пожалуйста автоматизировать сортировку файлов по папкам. Есть много файлов в папке с названиями this_file_001,...

Парсер имени файлов со списка, поиск по подкаталогам и запуск искомого файла
Добрый вечер уважаемые форумчане. Нужна ваша помощь в таком вопросе : По пути L:\avto2\category.txt имею текстовик с таким...

Сортировка списка файлов
Возникла проблемка ! Работаю с ASP, VBScript. Считываю из каталога список файлов с именами 1.avi, 2.avi и т.д. При выводе на страницу...

Сортировка списка файлов по дате
Приветствую. Произвожу поиск файлов по заданному пути по маске *.txt. Получаю список в стринглисте. Но мне нужно, что бы в этом...

Сортировка списка файлов в массиве
Доброго времени суток уважаемые форумчане! Помогите пожалуйста в таком вопросе: в папке &quot;base&quot; имеются файлы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru