powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
25 сообщений из 26, страница 1 из 2
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39837600
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. есть шаблон имени файла,
напр
[%param1%]#%param2%{%param3%}.ext
Файлы как бы по логике разные получаться будут (особенно если в шаблон дату-время с секундами пихать),
НО таки ситуация далеко не застрахована.
Может так случиться что вычислили имя, а файл с вычисленным именем уже есть в папке куда ложить новый.

Принцип - добавляем индекс
filename.ext
filename (2).ext
filename (3).ext

(либо индекса нет ==1, либо пробел + порядковый номер в скобках начиная с 2-х) - мыслю что сие разумно.

Т.е. для генерации конечного имени нового файла мне надо вычислить "максимальный индекс" из всех имеющихся файлов.
Добавим условие, что если напр. есть файлы (7) и (9), а остальных нет, то иже с ним, следующий будет (10).

Как бы разумно организовать алгоритм вычисления следующего имени?
P.S. Еще ничего не калякал, так поразмыслить просто для начала.
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39837613
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А че тут калякать-то?


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    /// <summary>
    /// получение свободного имени файла на базе указанного (добавляются цифры, если надо)
    /// </summary>
    private string FreeFileName(string fileName)
    {
      var i = 1;
      var currentFileName = fileName;
      while (File.Exists(Path.Combine(PathToSave, currentFileName)))
      {
        currentFileName = $"{Path.GetFileNameWithoutExtension(fileName)} ({i++}){Path.GetExtension(fileName)}";
      }
      return currentFileName;
    }
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39837614
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Добавим условие, что если напр. есть файлы (7) и (9), а остальных нет, то иже с ним, следующий будет (10).хотя да, вот этот момент я упустил, с этим чуть посложнее
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39837615
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, надо собрать все файлы по маске "filename (*).ext", регуляркой выцепить из последних скобок значение, конвернуть в int что получится конвертнуть и взять Max()
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39837616
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используйте сиквенс для генерации имени файла, каждый раз увеличивайте его на 1.
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39837630
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
 Private Sub ButtonGetNextFileName_Click(sender As Object, e As EventArgs) Handles ButtonGetNextFileName.Click
    MsgBox(GetNextFileName("filename", "C:\111\test"))
  End Sub

  Private Function GetNextFileName(ByVal sName As String, ByVal sFolder As String) As String
    Dim iMax As Integer = 0
    Dim ff As String() = IO.Directory.GetFiles(sFolder, sName & ".*") 'первый файл без (i)==(1)
    If (UBound(ff) > -1) Then iMax = 1 'есть первый файл без (i)==(1)
    ff = IO.Directory.GetFiles(sFolder, sName & " (*).*") ' все остальные с (i)
    For Each f As String In ff
      Dim sInd As String = IO.Path.GetFileNameWithoutExtension(f) 'отсекаем ".*"
      sInd = Strings.Right(sInd, Strings.Len(sInd) - Strings.Len(sName) - 2) 'отсекаем sName & " ("
      sInd = Strings.Left(sInd, Strings.Len(sInd) - 1) 'отсекаем ")"
      Dim iInd As Integer = CType(Val(sInd), Integer)
      If iInd > iMax Then iMax = iInd
    Next

    Dim sNextFileName As String = IIf((iMax > 0), sName & " (" & CStr(iMax + 1) & ")", sName)
    Return sNextFileName
  End Function


Но оно может чуть глючить в нек. малореальных частных случаях (хотя эти глюки некритичны, просто индекс скаканет не по делу).

У меня 3 конкретных расширения, каждое по 3 символа ("нумерация" должна быть общая для всех),
общий "mask" как то задать можно?
В паттерн так понял поддерживаются только * и ?, регулярки не поддерживаются. Надо схематично так:
Код: vbnet
1.
IO.Directory.GetFiles(sFolder, sName & ".{ex1}{ex2}{ex3}"
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39837635
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну в принципе могу сделать
Код: vbnet
1.
2.
IO.Directory.GetFiles(sFolder, sName & ".???")
IO.Directory.GetFiles(sFolder, sName & " (*).???")

(ext длиной 3 или меньше)
а потом проверить ext на равенство моим 3-м ext, если соответствует то учитывать
Но это "в спичках ковыряться".
Под * и ? тоже могут быть и точки и скобки.
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39837640
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    Dim iMax As Integer = 0
    Dim ff As String() = IO.Directory.GetFiles(sFolder, sName & ".*") 'первый файл без (i)==(1)
    If (UBound(ff) > -1) Then iMax = 1 'есть первый файл без (i)==(1)
    ff = IO.Directory.GetFiles(sFolder, sName & " (*).*") ' все остальные с (i)
    For Each f As String In ff
      Dim sInd As String = IO.Path.GetFileNameWithoutExtension(f) 'отсекаем ".*"
      sInd = Strings.Right(sInd, Strings.Len(sInd) - Strings.Len(sName) - 2) 'отсекаем sName & " ("
      sInd = Strings.Left(sInd, Strings.Len(sInd) - 1) 'отсекаем ")"
      Dim iInd As Integer = CType(Val(sInd), Integer)
      If iInd > iMax Then iMax = iInd
    Next

насколько лаконичнее можно написать этот фрагмент на Linq, и сразу ясно, о чём код.
Код: c#
1.
2.
3.
4.
5.
			var maxIndex = Directory.GetFiles(sFolder, sName & " (*).*")
				.Select(n => Regex.Match(n, @" \((\d+)\)\..{3}$"))
				.Where(n => n.Success)
				.DefaultIfEmpty()
				.Max(n => int.Parse(n?.Groups[1].Value ?? "0"));

Зря ты его не любишь
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39837643
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Ну я придерживаюсь классического VB. В принципе и мой код вполне понятен.
А Ling..я его не изучал никогда. Все мои проекты, они имеют обратную совместимость вниз до XP-Net2.0, т.е. Net4.5, но компилируется параллельно .Net2.0. В 2.0 линга нет. (про 4.0 я в курсе но у меня этот зоопарк минимизирован, да писал об этом не раз, чего повторяться).
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39837650
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при огромном количестве файлов тормозить будет знатно, сиквенс в этом плане в разы лучше.
никакого смысла в такой логике нет
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39837651
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77
Код: vbnet
1.
ff = IO.Directory.GetFiles(sFolder, sName & " (*).*") ' все остальные с (i)



А чего не регулярка? Зачем такие извраты :)
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39837666
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
  Private Sub ButtonGetNextFileName_Click(sender As Object, e As EventArgs) Handles ButtonGetNextFileName.Click
    MsgBox(GetNextFileName("filename", {"C:\111\test", "C:\Users\Dmitry\Desktop\Новая папка"}, {"tif", "pdf", "sff"}))
  End Sub

  Private Function GetNextFileName(ByVal sName As String, _
   ByVal sFolders As String(), ByVal sExts As String()) As String
    'поиск по заданным папкам sFolders + заданным расширениям

    Dim iMax As Integer = 0
    For Each sFolder As String In sFolders
      For Each sExt As String In sExts
        GetMaxFileIndex(sName, sFolder, sExt, iMax)
      Next
    Next

    Return IIf((iMax > 0), sName & " (" & CStr(iMax + 1) & ")", sName)
  End Function

  Private Sub GetMaxFileIndex(ByVal sName As String, ByVal sFolder As String, ByVal sExt As String, _
   ByRef iMax As Integer)
    'задается шаблон имени, папка поиска, расширение файла
    'ф-ция возвращает максимальный индекс iMax уже имеющегося файла (с учетом входного iMax)
    Dim ff As String() = IO.Directory.GetFiles(sFolder, sName & "." & sExt) 'первый файл без (i)==(1)
    If (UBound(ff) > -1) Then iMax = IIf((iMax > 1), iMax, 1) 'есть первый файл без (i)==(1)
    ff = IO.Directory.GetFiles(sFolder, sName & " (*)." & sExt) ' все остальные с (i)
    For Each f As String In ff
      Dim sInd As String = IO.Path.GetFileNameWithoutExtension(f) 'отсекаем ".*"
      sInd = Strings.Right(sInd, Strings.Len(sInd) - Strings.Len(sName) - 2) 'отсекаем sName & " ("
      sInd = Strings.Left(sInd, Strings.Len(sInd) - 1) 'отсекаем ")"
      Dim iInd As Integer = CType(Val(sInd), Integer)
      If iInd > iMax Then iMax = iInd
    Next
  End Sub
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39837704
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДмитрий77
Код: vbnet
1.
ff = IO.Directory.GetFiles(sFolder, sName & " (*).*") ' все остальные с (i)




А чего не регулярка? а разве GetFiles поддерживает маску в виде регулярки?
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39837800
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proа разве GetFiles поддерживает маску в виде регулярки?

вот пример достойной реализации роллинга файлов

https://github.com/serilog/serilog-sinks-file/blob/dev/src/Serilog.Sinks.File/Sinks/File/PathRoller.cs
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39837960
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий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.
  Private Sub GetMaxFileIndex(ByVal sName As String, ByVal sFolder As String, ByVal sExt As String, _
   ByRef iMax As Integer)
    'задается шаблон имени, папка поиска, расширение файла
    'ф-ция возвращает максимальный индекс iMax уже имеющегося файла (с учетом входного iMax)

    If IO.Directory.Exists(sFolder) = False Then Exit Sub 'sFolder не существует, неверные символы и т.п.

    Dim ff As String() = IO.Directory.GetFiles(sFolder, sName & "." & sExt) 'первый файл без (i)==(1)
    If (UBound(ff) > -1) Then iMax = IIf((iMax > 1), iMax, 1) 'есть первый файл без (i)==(1)
    ff = IO.Directory.GetFiles(sFolder, sName & " (*)." & sExt) ' все остальные с (i)
    For Each f As String In ff
      Dim sInd As String = IO.Path.GetFileNameWithoutExtension(f) 'отсекаем ".*"
      sInd = Strings.Right(sInd, Strings.Len(sInd) - Strings.Len(sName) - 2) 'отсекаем sName & " ("
      sInd = Strings.Left(sInd, Strings.Len(sInd) - 1) 'отсекаем ")"
      Dim iInd As Integer = CType(Val(sInd), Integer)
      If iInd > iMax Then iMax = iInd
    Next
  End Sub


Больше пока проблем в коде не вижу (хотя и не ling, и не регулярка).
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39837973
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не, увидел избыток мысли.
Код: vbnet
1.
Dim ff As String() = IO.Directory.GetFiles(sFolder, sName & "." & sExt) 'первый файл без (i)==(1)

Изначально было (и поэтому оправдано)
Код: vbnet
1.
Dim ff As String() = IO.Directory.GetFiles(sFolder, sName & ".*") 'первый файл без (i)==(1)

If IO.File.Exists для первого файла достаточно.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  Private Sub GetMaxFileIndex(ByVal sName As String, ByVal sFolder As String, ByVal sExt As String, _
   ByRef iMax As Integer)
    'задается шаблон имени, папка поиска, расширение файла
    'ф-ция возвращает максимальный индекс iMax уже имеющегося файла (с учетом входного iMax)

    If IO.Directory.Exists(sFolder) = False Then Exit Sub 'sFolder не существует, неверные символы и т.п.

    If IO.File.Exists(IO.Path.Combine(sFolder, sName & "." & sExt)) Then _
     iMax = IIf((iMax > 1), iMax, 1) 'первый файл без (i)==(1)
    Dim ff As String() = IO.Directory.GetFiles(sFolder, sName & " (*)." & sExt) ' все остальные с (i)
    For Each f As String In ff
      Dim sInd As String = IO.Path.GetFileNameWithoutExtension(f) 'отсекаем ".*"
      sInd = Strings.Right(sInd, Strings.Len(sInd) - Strings.Len(sName) - 2) 'отсекаем sName & " ("
      sInd = Strings.Left(sInd, Strings.Len(sInd) - 1) 'отсекаем ")"
      Dim iInd As Integer = CType(Val(sInd), Integer)
      If iInd > iMax Then iMax = iInd
    Next
  End Sub
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39838065
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

проблема метода GetMaxFileIndex в том, что он не атомарен вкупе с применением.
вроде вероятность словить проблему низка, но всё же. не так сложно сделать атомарное решение.
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39838111
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttвроде вероятность словить проблему низка, но всё же...
Ну, примеры "проблем" привести можно.
Код: vbnet
1.
2.
filename (bla-bla) (5).ext
filename (240) (5).ext

В первом случае вернет 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)

Вот и вся "атомарность". У меня алгоритм явно лучше. Ювелирная точность она не всегда нужна, а абсолютной "защиты от дурака" не существует. Хреново когда крашит и когда данные теряются.

Ладно, чего рассуждать, пошел "имплементировать".
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39838113
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Ну, примеры "проблем" привести можно.

Проблема в другом, между вызовами твоих методов, может случиться, что кто-то другой создаст файл. Вряд ли это будет другая программа, скорее другой инстанс этого же приложения, или поток. В общем, надо не вычислять имя файла, а пытаться его создать -- результат это созданный файл, а не вычисление имени с последующим созданием.

И это не "ювелирная точность", это просто подход к надёжной разработке, который на взлёте исключает разные проблемы, даже если не они особо вероятные.
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39838120
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
  // Запуск ...+ cmd
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  ZeroMemory(&si, sizeof(si));
  si.cb = sizeof(si);
  si.dwFlags = STARTF_USESHOWWINDOW;
  si.wShowWindow = SW_HIDE;
  ZeroMemory(&pi, sizeof(pi));
  // Start the shelled application:
  if (CreateProcess(szRouteFilename, szCMD, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, szDllPath, &si, &pi)) {
...
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);


Но естественно факс-сервер сам многопоточный (+ CreateProcess уже новый поток) и если два факса принято одновременно двумя "девайсами" (что в принципе возможно только на WinServer), то да, будут запущены два инстанса параллельно и в разных потоках.
Но это какова должна быть вероятность что два факса приняты секунда в секунду, при том что использование паттернов (предположительно с датой-временем, CallerID -которые уже скорее всего сделают имена разными), и при этом чтоб еще именно это место кода стукнуло-перекрестилось на этих двух инстансах именно миллисекунда в миллисекунду чтоб произошло то о чем речь.

Вероятность отключения электроэнергии, или что придет чудо-юдо с кувалдометром и стукнет по THIS компу ИМХО в разы больше.
======
В другом приложении (полностью моя кухня), куда видимо тоже буду это вставлять,
вероятности вообще нет, потому что там этими делами занимается однопоточный менеджер,
делающий такие дела "последовательно и неспеша по мере поступления: без очереди не лезем".
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39838129
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Но это какова должна быть вероятность что два факса приняты секунда в секунду, при том что использование паттернов (предположительно с датой-временем, CallerID -которые уже скорее всего сделают имена разными), и при этом чтоб еще именно это место кода стукнуло-перекрестилось на этих двух инстансах именно миллисекунда в миллисекунду чтоб произошло то о чем речь.

Это понятно :)
Я бы понял, если бы затраты на надёжность решения не оправдывалось вероятностью факапа.
Но в данном случае это абсолютно дешево.
Дешевле и быстрее, чем самого себя (и ещё кого) убеждать, что это не случится :)
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39838133
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttне вычислять имя файла, а пытаться его создать ...Дешевле и быстрее,
Любовь к Try...Catch, которые лично я паталогически ненавижу? (авось проканает, а не проканает так мы еще простыню Try Cath-ей навешаем)
А если у меня задано несколько папок и я хочу во все с одинаковым именем.
В одной папке будет Try, в другой Catch. И что мне потом с этим бардаком делать?
hVostt надёжность решения
Ожидание-придумывание каких-то мифических факапов за каждым углом и фанатическое желание побороть их все и вся,
приводит к неоправданному усложнению кода, с вероятностью новых факапов и дальнейшим снижением этой самой надежности/отказоустойчивости.
Не бывает ничего идеального.

При копировании у меня по-любому в коде стоит (с Try Catch кстати):
Код: vbnet
1.
2.
3.
4.
5.
6.
        Try
          IO.File.Copy(in_file, out_file, True)
          AddRouteLog("   Copying file '" & in_file & "' into '" & out_file & "'... OK.")
        Catch
          AddRouteLog("   Copying file '" & in_file & "' into '" & out_file & "'... Failed. Error=" & Err.Number.ToString & " (" & Err.Description & ")")
        End Try


Ну, самое плохое что таки-перезапишет или не сможет записать. Краша не будет. Один раз в мильон лет. Ну и черт с ним.
Я стараюсь писать так, чтоб без крашей. Потому что выскочевшее окно с ошибкой кастомер конечно заметит и будет недоволен,
а если один раз в сто лет прога случайно что-то не сделает или сделает не совсем как хотелось, кастомер скорее всего этого вообще не заметит.

hVosttчем самого себя (и ещё кого) убеждать,
Не хочу ничего никому доказывать. Меня так устраивает. И кастомеров видимо тоже.
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39838150
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Не хочу ничего никому доказывать. Меня так устраивает
Плохо вяжется с твоим перфекционизмом
Дмитрий77Я стараюсь писать так, чтоб без крашей. Потому что выскочевшее окно с ошибкой кастомер конечно заметит и будет недоволен
Обработка исключений дклается совсем не для того, чтобы выкинуть сообщение пользователю. В мультизадачной среде любые проверки на существование / отсутствие
чего-либо вне транзакции опасны
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39838328
Colt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, может глупость скажу, но почему бы не формировать имена файлов сразу в виде:
File_{ тут забиты всякие важные параметры (дата, телефон и пр.) }_{ а тут GUID }.ext
Тогда ничего не надо вычислять по уже имеющемуся набору файлов и, даже, если в два разных файла будут иметь одинаковые «важные параметры», то пересечения по имени файла не будет.
...
Рейтинг: 0 / 0
Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
    #39838440
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ColtПрошу прощения, может глупость скажу, но почему бы не формировать имена файлов сразу в виде:
File_{ тут забиты всякие важные параметры (дата, телефон и пр.) }_{ а тут GUID }.ext
Тогда ничего не надо вычислять по уже имеющемуся набору файлов и, даже, если в два разных файла будут иметь одинаковые «важные параметры», то пересечения по имени файла не будет.
Нет, не глупость, примерно так и делал.
Здесь код как делал

тут забиты всякие важные параметры (дата, телефон и пр.)
По дефолту забивать все "важные параметры" -многовато-длинновато будет для имени файла.
Надо дать юзеру возможность выбора.

ИзопропилДмитрий77Не хочу ничего никому доказывать. Меня так устраиваетПлохо вяжется с твоим перфекционизмом
Ввязываюсь в дискуссии, трачу время вместо чтоб дела делать. Надо ж остановиться где-то.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как лучше вычислить "имя следующего файла (n)" (файлы по шаблону, могут быть одинаковые)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]