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