4
4
// It is useful we we need to overwrite an existing folder or file,
5
5
// but need user confirmation for that.
6
6
bool FileCreate(RAROptions *Cmd,File *NewFile,wchar *Name,size_t MaxNameSize,
7
OVERWRITE_MODE Mode,bool *UserReject,int64 FileSize,
8
RarTime *FileTime,bool WriteOnly)
7
bool *UserReject,int64 FileSize,RarTime *FileTime,bool WriteOnly)
10
9
if (UserReject!=NULL)
30
29
// autorename below can change the name, so we need to check it again.
31
30
ShortNameChanged=false;
33
if (Mode==OVERWRITE_NONE)
32
UIASKREP_RESULT Choice=uiAskReplaceEx(Cmd,Name,MaxNameSize,FileSize,FileTime,(NewFile==NULL ? UIASKREP_F_NORENAME:0));
34
if (Choice==UIASKREP_R_REPLACE)
36
if (Choice==UIASKREP_R_SKIP)
35
38
if (UserReject!=NULL)
40
// Must be before Cmd->AllYes check or -y switch would override -or.
41
if (Mode==OVERWRITE_AUTORENAME)
43
if (!GetAutoRenamedName(Name,MaxNameSize))
44
Mode=OVERWRITE_DEFAULT;
52
// This check must be after OVERWRITE_AUTORENAME processing or -y switch
53
// would override -or.
54
if (Cmd->AllYes || Mode==OVERWRITE_ALL)
57
if (Mode==OVERWRITE_DEFAULT || Mode==OVERWRITE_FORCE_ASK)
61
eprintf(St(MFileExists),Name);
62
int Choice=Ask(St(MYesNoAllRenQ));
73
Cmd->Overwrite=OVERWRITE_ALL;
80
Cmd->Overwrite=OVERWRITE_NONE;
86
mprintf(St(MAskNewName));
87
if (!getwstr(NewName,ASIZE(NewName)))
89
// Process fwgets failure as if user answered 'No'.
95
if (PointToName(NewName)==NewName)
96
SetName(Name,NewName,MaxNameSize);
98
wcsncpyz(Name,NewName,MaxNameSize);
102
ErrHandler.Exit(RARX_USERBREAK);
42
if (Choice==UIASKREP_R_CANCEL)
43
ErrHandler.Exit(RARX_USERBREAK);
105
45
uint FileMode=WriteOnly ? FMF_WRITE|FMF_SHAREREAD:FMF_UPDATE|FMF_SHAREREAD;
106
46
if (NewFile!=NULL && NewFile->Create(Name,FileMode))
108
PrepareToDelete(Name);
109
48
CreatePath(Name,true);
110
49
return NewFile!=NULL ? NewFile->Create(Name,FileMode):DelFile(Name);
114
53
bool GetAutoRenamedName(wchar *Name,size_t MaxNameSize)
116
55
wchar NewName[NM];
117
if (wcslen(Name)>ASIZE(NewName)-10)
56
size_t NameLength=wcslen(Name);
58
if (NameLength>ASIZE(NewName)-10)
119
61
wchar *Ext=GetExt(Name);
121
Ext=Name+wcslen(Name);
123
64
for (uint FileVer=1;;FileVer++)
66
#ifdef _ANDROID // No swprintf in Android NDK r9.
67
uint NamePrefixLength=Ext-Name;
68
wcsncpy(NewName,Name,NamePrefixLength);
69
wcscpy(NewName+NamePrefixLength,L"(");
70
itoa(FileVer,NewName+NamePrefixLength+1);
125
74
swprintf(NewName,ASIZE(NewName),L"%.*ls(%u)%ls",uint(Ext-Name),Name,FileVer,Ext);
126
76
if (!FileExist(NewName))
128
78
wcsncpyz(Name,NewName,MaxNameSize);
201
151
File KeepShortFile;
202
152
bool Created=false;
203
153
if (!FileExist(Name))
204
Created=KeepShortFile.Create(Name);
154
Created=KeepShortFile.Create(Name,FMF_WRITE|FMF_SHAREREAD);
206
156
// Now we rename the existing file from temporary name to original long name.
207
157
// Since its previous short name is occupied by another file, it should