|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
Т.е. есть шаблон имени файла, напр [%param1%]#%param2%{%param3%}.ext Файлы как бы по логике разные получаться будут (особенно если в шаблон дату-время с секундами пихать), НО таки ситуация далеко не застрахована. Может так случиться что вычислили имя, а файл с вычисленным именем уже есть в папке куда ложить новый. Принцип - добавляем индекс filename.ext filename (2).ext filename (3).ext (либо индекса нет ==1, либо пробел + порядковый номер в скобках начиная с 2-х) - мыслю что сие разумно. Т.е. для генерации конечного имени нового файла мне надо вычислить "максимальный индекс" из всех имеющихся файлов. Добавим условие, что если напр. есть файлы (7) и (9), а остальных нет, то иже с ним, следующий будет (10). Как бы разумно организовать алгоритм вычисления следующего имени? P.S. Еще ничего не калякал, так поразмыслить просто для начала. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2019, 18:45 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
А че тут калякать-то? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2019, 20:26 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
Дмитрий77Добавим условие, что если напр. есть файлы (7) и (9), а остальных нет, то иже с ним, следующий будет (10).хотя да, вот этот момент я упустил, с этим чуть посложнее ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2019, 20:27 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
В общем, надо собрать все файлы по маске "filename (*).ext", регуляркой выцепить из последних скобок значение, конвернуть в int что получится конвертнуть и взять Max() ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2019, 20:29 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
используйте сиквенс для генерации имени файла, каждый раз увеличивайте его на 1. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2019, 20:34 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
Shocker.ProВ общем, надо собрать все файлы по маске "filename (*).ext", регуляркой выцепить из последних скобок значение, конвернуть в int что получится конвертнуть и взять Max() Ну вот так пока накатал Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Но оно может чуть глючить в нек. малореальных частных случаях (хотя эти глюки некритичны, просто индекс скаканет не по делу). У меня 3 конкретных расширения, каждое по 3 символа ("нумерация" должна быть общая для всех), общий "mask" как то задать можно? В паттерн так понял поддерживаются только * и ?, регулярки не поддерживаются. Надо схематично так: Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2019, 22:01 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
Ну в принципе могу сделать Код: vbnet 1. 2.
(ext длиной 3 или меньше) а потом проверить ext на равенство моим 3-м ext, если соответствует то учитывать Но это "в спичках ковыряться". Под * и ? тоже могут быть и точки и скобки. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2019, 22:13 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
Дмитрий77 Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
насколько лаконичнее можно написать этот фрагмент на Linq, и сразу ясно, о чём код. Код: c# 1. 2. 3. 4. 5.
Зря ты его не любишь ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2019, 22:53 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
Shocker.Pro, Ну я придерживаюсь классического VB. В принципе и мой код вполне понятен. А Ling..я его не изучал никогда. Все мои проекты, они имеют обратную совместимость вниз до XP-Net2.0, т.е. Net4.5, но компилируется параллельно .Net2.0. В 2.0 линга нет. (про 4.0 я в курсе но у меня этот зоопарк минимизирован, да писал об этом не раз, чего повторяться). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2019, 23:13 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
при огромном количестве файлов тормозить будет знатно, сиквенс в этом плане в разы лучше. никакого смысла в такой логике нет ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2019, 23:41 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
Дмитрий77 Код: vbnet 1.
А чего не регулярка? Зачем такие извраты :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2019, 23:41 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
Roman Mejtesпри огромном количестве файлов тормозить будет знатно, При каком? 1000? 2000? 10000? 100000? К-во файлов в папке - это к-во принятых факсов (за минусом тех, что юзер удалил, раскидал и т.п). Вот сколько нужно/можно принять (!!! не отправить в виде спам-рассылки, а чтоб тебе их прислали да еще в 2019г. когда все компы - в основном сервера у буржуев i5-i7 чего там еще) чтоб стормозило? Я думаю на какой-нибудь конвертации TIFF->PDF в порядки больше тормозит. Я думаю в самом фанатичном случае из будет там лежать пара-тройка сотен. Критично? Roman Mejtesсиквенс в этом плане в разы лучше. Можно как-нибудь кодом проиллюстрировать? (.Net2-совместимым, мои хотелки, уж извиняйте) Пока вот такое тестовое чудо сварганил (и честно пока планирую на ем остановиться, даб время не тратить): Т.е. ищем в наборе папок (м.б. несколько), среди заданных расширений (3 штуки их у меня), предмет поиска 1) pattern.ext ' max number=1 2) pattern (max number).ext 3) если ничего нет, max number=0 надо родить "следующее имя", если какие-то номера пропущены, все равно пляшем от максимального (без тупого перебора всех имен файлов по логике никак, другое дело что в силу м.б. неоптимизированности ф-ции и неоптимизированности моего кода я этот перебор делаю несколько раз - ну минимум 3). Но ИМХО сдается мне, это спички , и весь .Net точно также "неоптимизирован" если на то пошло. Код: vbnet 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2019, 01:04 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
hVosttДмитрий77 Код: vbnet 1.
А чего не регулярка? а разве GetFiles поддерживает маску в виде регулярки? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2019, 08:46 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
Shocker.Proа разве GetFiles поддерживает маску в виде регулярки? вот пример достойной реализации роллинга файлов https://github.com/serilog/serilog-sinks-file/blob/dev/src/Serilog.Sinks.File/Sinks/File/PathRoller.cs ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2019, 11:47 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
Дмитрий77Пока вот такое тестовое чудо сварганил Забыл подстраховаться на предмет поиска в несуществующей (удаленной) folder Чтоб IO.Directory.GetFiles ошибку не генерила. Ситуация реальная: юзер задал папку для копирования, а потом ее ручками удалил for some reason. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Больше пока проблем в коде не вижу (хотя и не ling, и не регулярка). ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2019, 16:47 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
А не, увидел избыток мысли. Код: vbnet 1.
Изначально было (и поэтому оправдано) Код: vbnet 1.
If IO.File.Exists для первого файла достаточно. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2019, 17:06 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
Дмитрий77, проблема метода GetMaxFileIndex в том, что он не атомарен вкупе с применением. вроде вероятность словить проблему низка, но всё же. не так сложно сделать атомарное решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2019, 20:56 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
hVosttвроде вероятность словить проблему низка, но всё же... Ну, примеры "проблем" привести можно. Код: vbnet 1. 2.
В первом случае вернет iInd=0 Во втором вернет iInd=240 вместо 5 Но, во первых сама программа такую фигню не генерит (если только ее случайно в эту папку зачем-то не подложили), а во вторых ни генерация файла filename (5).ext в первом случае (если его там нет, а если есть то будет найден), ни генерация файла filename (241).ext с завышенным номером ни к какой критической ошибке ни приведет, документ не потеряем, и поверх ничего не перезапишем. Я смотрел как подобное реализовано в довольно известной программе Ventafax, она еще не такое "отжигает". Т.е. ставим в венте опцию "последовательная нумерация". (я такой опции не делаю, а только борюсь с "одинаковыми именами", но к примеру если поставить константный паттерн FAX, то оно и будет FAX (2), FAX (3),... по моему алгоритму) И к примеру такие файлы (после # -это FaxId) # 8 499 555-2020 16-07-2019 (2) # 812 777-88-88 17-07-2019 (3) # 7 (495) 220-1515 17-07-2019 (4) А следующий у них тогда будет # (495) 220-1515 17-07-2019 (496) Вот и вся "атомарность". У меня алгоритм явно лучше. Ювелирная точность она не всегда нужна, а абсолютной "защиты от дурака" не существует. Хреново когда крашит и когда данные теряются. Ладно, чего рассуждать, пошел "имплементировать". ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2019, 00:31 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
Дмитрий77Ну, примеры "проблем" привести можно. Проблема в другом, между вызовами твоих методов, может случиться, что кто-то другой создаст файл. Вряд ли это будет другая программа, скорее другой инстанс этого же приложения, или поток. В общем, надо не вычислять имя файла, а пытаться его создать -- результат это созданный файл, а не вычисление имени с последующим созданием. И это не "ювелирная точность", это просто подход к надёжной разработке, который на взлёте исключает разные проблемы, даже если не они особо вероятные. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2019, 00:34 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
hVosttдругой инстанс этого же приложения, или поток. Я Вас услышал. Чисто теоретически вероятность есть. Метод "Store in Folder" (в том приложении которым счас занимаюсь) у меня реализован через мою C++ библиотеку "Fax Routing Extension": https://docs.microsoft.com/fr-fr/previous-versions/windows/desktop/fax/-mfax-about-the-fax-routing-extension-api которая и вызывает через CreateProcess мою net-гавнокодно- интеллектуальную однопоточную "cmd.exe [params]", которая "все дела делает" а затем самотеком идет на exit. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Но естественно факс-сервер сам многопоточный (+ CreateProcess уже новый поток) и если два факса принято одновременно двумя "девайсами" (что в принципе возможно только на WinServer), то да, будут запущены два инстанса параллельно и в разных потоках. Но это какова должна быть вероятность что два факса приняты секунда в секунду, при том что использование паттернов (предположительно с датой-временем, CallerID -которые уже скорее всего сделают имена разными), и при этом чтоб еще именно это место кода стукнуло-перекрестилось на этих двух инстансах именно миллисекунда в миллисекунду чтоб произошло то о чем речь. Вероятность отключения электроэнергии, или что придет чудо-юдо с кувалдометром и стукнет по THIS компу ИМХО в разы больше. ====== В другом приложении (полностью моя кухня), куда видимо тоже буду это вставлять, вероятности вообще нет, потому что там этими делами занимается однопоточный менеджер, делающий такие дела "последовательно и неспеша по мере поступления: без очереди не лезем". ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2019, 01:44 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
Дмитрий77Но это какова должна быть вероятность что два факса приняты секунда в секунду, при том что использование паттернов (предположительно с датой-временем, CallerID -которые уже скорее всего сделают имена разными), и при этом чтоб еще именно это место кода стукнуло-перекрестилось на этих двух инстансах именно миллисекунда в миллисекунду чтоб произошло то о чем речь. Это понятно :) Я бы понял, если бы затраты на надёжность решения не оправдывалось вероятностью факапа. Но в данном случае это абсолютно дешево. Дешевле и быстрее, чем самого себя (и ещё кого) убеждать, что это не случится :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2019, 02:41 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
hVosttне вычислять имя файла, а пытаться его создать ...Дешевле и быстрее, Любовь к Try...Catch, которые лично я паталогически ненавижу? (авось проканает, а не проканает так мы еще простыню Try Cath-ей навешаем) А если у меня задано несколько папок и я хочу во все с одинаковым именем. В одной папке будет Try, в другой Catch. И что мне потом с этим бардаком делать? hVostt надёжность решения Ожидание-придумывание каких-то мифических факапов за каждым углом и фанатическое желание побороть их все и вся, приводит к неоправданному усложнению кода, с вероятностью новых факапов и дальнейшим снижением этой самой надежности/отказоустойчивости. Не бывает ничего идеального. При копировании у меня по-любому в коде стоит (с Try Catch кстати): Код: vbnet 1. 2. 3. 4. 5. 6.
Ну, самое плохое что таки-перезапишет или не сможет записать. Краша не будет. Один раз в мильон лет. Ну и черт с ним. Я стараюсь писать так, чтоб без крашей. Потому что выскочевшее окно с ошибкой кастомер конечно заметит и будет недоволен, а если один раз в сто лет прога случайно что-то не сделает или сделает не совсем как хотелось, кастомер скорее всего этого вообще не заметит. hVosttчем самого себя (и ещё кого) убеждать, Не хочу ничего никому доказывать. Меня так устраивает. И кастомеров видимо тоже. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2019, 04:00 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
Дмитрий77Не хочу ничего никому доказывать. Меня так устраивает Плохо вяжется с твоим перфекционизмом Дмитрий77Я стараюсь писать так, чтоб без крашей. Потому что выскочевшее окно с ошибкой кастомер конечно заметит и будет недоволен Обработка исключений дклается совсем не для того, чтобы выкинуть сообщение пользователю. В мультизадачной среде любые проверки на существование / отсутствие чего-либо вне транзакции опасны ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2019, 07:58 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
Прошу прощения, может глупость скажу, но почему бы не формировать имена файлов сразу в виде: File_{ тут забиты всякие важные параметры (дата, телефон и пр.) }_{ а тут GUID }.ext Тогда ничего не надо вычислять по уже имеющемуся набору файлов и, даже, если в два разных файла будут иметь одинаковые «важные параметры», то пересечения по имени файла не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2019, 14:33 |
|
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
|
|||
---|---|---|---|
#18+
ColtПрошу прощения, может глупость скажу, но почему бы не формировать имена файлов сразу в виде: File_{ тут забиты всякие важные параметры (дата, телефон и пр.) }_{ а тут GUID }.ext Тогда ничего не надо вычислять по уже имеющемуся набору файлов и, даже, если в два разных файла будут иметь одинаковые «важные параметры», то пересечения по имени файла не будет. Нет, не глупость, примерно так и делал. Здесь код как делал тут забиты всякие важные параметры (дата, телефон и пр.) По дефолту забивать все "важные параметры" -многовато-длинновато будет для имени файла. Надо дать юзеру возможность выбора. ИзопропилДмитрий77Не хочу ничего никому доказывать. Меня так устраиваетПлохо вяжется с твоим перфекционизмом Ввязываюсь в дискуссии, трачу время вместо чтоб дела делать. Надо ж остановиться где-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2019, 18:39 |
|
|
start [/forum/topic.php?fid=20&msg=39837600&tid=1398876]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
155ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 254ms |
0 / 0 |