Давно сталкивался с дублями имен файлов. Файловые оболочки - 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
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")
Комментарии
Отправить комментарий