DllExport int
win32_rename(const char *oname, const char *newname)
{
char szOldName[MAX_PATH+1];
BOOL bResult;
DWORD dwFlags = MOVEFILE_COPY_ALLOWED;
dTHX;
if (stricmp(newname, oname))
dwFlags |= MOVEFILE_REPLACE_EXISTING;
strcpy(szOldName, PerlDir_mapA(oname));
bResult = MoveFileExA(szOldName,PerlDir_mapA(newname), dwFlags);
if (!bResult) {
DWORD err = GetLastError();
switch (err) {
case ERROR_BAD_NET_NAME:
case ERROR_BAD_NETPATH:
case ERROR_BAD_PATHNAME:
case ERROR_FILE_NOT_FOUND:
case ERROR_FILENAME_EXCED_RANGE:
case ERROR_INVALID_DRIVE:
case ERROR_NO_MORE_FILES:
case ERROR_PATH_NOT_FOUND:
errno = ENOENT;
break;
case ERROR_DISK_FULL:
errno = ENOSPC;
break;
case ERROR_NOT_ENOUGH_QUOTA:
errno = EDQUOT;
break;
default:
errno = EACCES;
break;
}
return -1;
}
return 0;
}
####
// movetest.cpp
// compile with: CL /W3 /MD movetest.cpp
// example run: movetest fromfile tofile
#include
#include
int main(int argc, char* argv[])
{
if (argc != 3)
{
fprintf(stderr, "usage: movetest file1 file2\n");
return 1;
}
char* from = argv[1];
char* to = argv[2];
fprintf(stderr, "move '%s' to '%s'...", from, to);
if (!MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING))
{
fprintf(stderr, "failed: error=%lu\n", (unsigned long)GetLastError());
return 2;
}
fprintf(stderr, "done.\n");
return 0;
}
##
##
movetest newfile.txt originalfile.txt