uniqname()

 Давно сталкивался с дублями имен файлов. Файловые оболочки - Total Commander и Q-Dir справляются с совпадающими именами файлов просто - добавляют к имени приставку (номер).

Мне захотелось создать подобное имя для существующего файла. Неделю страдал над кодом и все-таки осилил. Идея проста - если файл существует, то попытаться найти приставку (N) и выделить тот самый номер. Если номер неправильный, то начать нумерацию с 1.

Procedure.s inc_s(n$)
  r$=""
  add=1
  For i=Len(n$) To 1 Step -1
    co=Asc(Mid(n$,i,1))+add
    If co=$3A
      co=$30
      add=1
    Else
      add=0
    EndIf
    r$=Chr(co)+r$
  Next i
  If add
    r$="1"+r$
  EndIf
  ProcedureReturn r$
EndProcedure

Procedure IsNumeric(String$)
  If String$ = "" : ProcedureReturn #False : EndIf
  For i=1 To Len(String$)
    c$=Mid(String$,i,1)
    If c$ < "0" Or c$ > "9"
      ProcedureReturn #False ; Found a non-digit character
    EndIf
  Next i
  ProcedureReturn #True
EndProcedure

Procedure.s uniq(f$)
  If FileSize(f$)>0
  p$=GetPathPart(f$)
  ff$=GetFilePart(f$,#PB_FileSystem_NoExtension)
  e$=GetExtensionPart(f$)
  If e$<>""
    e$="."+e$
  EndIf
  n$="1"
  ;check(N)
  If Right(ff$,1)=")"
    brpos=-1
    For i=Len(ff$) To 1 Step-1
      If Mid(ff$,i,1)="("
        brpos=i
        Break 1
      EndIf
    Next i
    If brpos<>-1
      nl=Len(ff$)-brpos-1
      nn$=Mid(ff$,brpos+1,nl)
      If IsNumeric(nn$)
        n$=nn$
        ff$=Mid(ff$,1,brpos-1)
      EndIf
    EndIf
  EndIf;If Right(ff$,1)=")"
  
  Repeat
    d$=p$+ff$+"("+n$+")"+e$
    n$=inc_s(n$)
  Until FileSize(d$)=-1
  
Else
  d$=f$
EndIf
ProcedureReturn d$
EndProcedure
Procedure tst(f$)
  d$=uniq(f$)
  If FileSize(d$)=-1
    CopyFile(f$,d$)
  Else
    Debug "dupe: "+d$
   EndIf
EndProcedure
tst("d:\uniqname\favicon.ico")
tst("d:\uniqname\favicon(1).ico")
tst("d:\uniqname\favicon(a).ico")
tst("d:\uniqname\favicon(123).ico")

Комментарии