aboutsummaryrefslogtreecommitdiffstats
path: root/win32/win32.c
diff options
context:
space:
mode:
authoreban <eban@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-08-09 04:26:06 +0000
committereban <eban@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-08-09 04:26:06 +0000
commita3edeb5fec3dfb064a1745881f5c5ec68e2abc92 (patch)
tree8203ce8ed2cc35bcfd59157fb953bd8681e3bd45 /win32/win32.c
parentbc90f95def78c5c24ea605b825c5a4ee27b0ed74 (diff)
downloadruby-a3edeb5fec3dfb064a1745881f5c5ec68e2abc92.tar.gz
eban
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@881 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'win32/win32.c')
-rw-r--r--win32/win32.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/win32/win32.c b/win32/win32.c
index 7d589ec593..d7f12d3f0b 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -2432,3 +2432,51 @@ win32_getenv(const char *name)
return curitem;
}
+
+int
+myrename(const char *oldpath, const char *newpath)
+{
+ int res = 0;
+ int oldatts;
+ int newatts;
+
+ oldatts = GetFileAttributes(oldpath);
+ newatts = GetFileAttributes(newpath);
+
+ if (oldatts == -1) {
+ printf("file to move doesn't exist");
+ return -1;
+ }
+
+ if (newatts != -1 && newatts & FILE_ATTRIBUTE_READONLY)
+ SetFileAttributesA(newpath, newatts & ~ FILE_ATTRIBUTE_READONLY);
+
+ if (!MoveFile(oldpath, newpath))
+ res = -1;
+
+ if (res == 0 || (GetLastError() != ERROR_ALREADY_EXISTS
+ && GetLastError() != ERROR_FILE_EXISTS))
+ goto done;
+
+ if (IsWinNT()) {
+ if (MoveFileEx(oldpath, newpath, MOVEFILE_REPLACE_EXISTING))
+ res = 0;
+ } else {
+ for (;;) {
+ if (!DeleteFile(newpath) && GetLastError() != ERROR_FILE_NOT_FOUND)
+ break;
+ else if (MoveFile(oldpath, newpath)) {
+ res = 0;
+ break;
+ }
+ }
+ }
+
+done:
+ if (res)
+ errno = GetLastError();
+ else
+ SetFileAttributes(newpath, oldatts);
+
+ return res;
+}