* - we need a io method to get win32 paths
* or to wrap this system call
*/
- if (!MoveFileEx (s.c_str (), d.c_str (),
- MOVEFILE_DELAY_UNTIL_REBOOT |
- MOVEFILE_REPLACE_EXISTING))
+ WCHAR sname[s.size () + 7];
+ WCHAR dname[d.size () + 7];
+ /* Windows 2000 has a bug: Prepending \\?\ does not
+ * work in conjunction with MOVEFILE_DELAY_UNTIL_REBOOT.
+ * So in case of Windows 2000 we just convert the path
+ * to wide char and hope for the best. */
+ if (OSMajorVersion () == 5 && OSMinorVersion () == 0)
+ {
+ mbstowcs (sname, s.c_str (), s.size () + 7);
+ mbstowcs (dname, d.c_str (), d.size () + 7);
+ }
+ else
+ {
+ mklongpath (sname, s.c_str (), s.size () + 7);
+ mklongpath (dname, d.c_str (), d.size () + 7);
+ }
+ if (!MoveFileExW (sname, dname,
+ MOVEFILE_DELAY_UNTIL_REBOOT |
+ MOVEFILE_REPLACE_EXISTING))
replaceOnRebootFailed (fn);
else
replaceOnRebootSucceeded (fn, rebootneeded);
}
std::string d = cygpath ("/" + line);
- DWORD dw = GetFileAttributes (d.c_str());
- if (dw != INVALID_FILE_ATTRIBUTES
- && !(dw & FILE_ATTRIBUTE_DIRECTORY))
+ WCHAR wname[d.size () + 11]; /* Prefix + ".lnk". */
+ if (IsWindowsNT ())
{
- log (LOG_BABBLE) << "unlink " << d << endLog;
- SetFileAttributes (d.c_str(), dw & ~FILE_ATTRIBUTE_READONLY);
- DeleteFile (d.c_str());
+ mklongpath (wname, d.c_str (), d.size () + 11);
+ DWORD dw = GetFileAttributesW (wname);
+ if (dw != INVALID_FILE_ATTRIBUTES
+ && !(dw & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ log (LOG_BABBLE) << "unlink " << d << endLog;
+ SetFileAttributesW (wname, dw & ~FILE_ATTRIBUTE_READONLY);
+ DeleteFileW (wname);
+ }
+ }
+ else
+ {
+ DWORD dw = GetFileAttributesA (d.c_str());
+ if (dw != INVALID_FILE_ATTRIBUTES
+ && !(dw & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ log (LOG_BABBLE) << "unlink " << d << endLog;
+ SetFileAttributesA (d.c_str(), dw & ~FILE_ATTRIBUTE_READONLY);
+ DeleteFileA (d.c_str());
+ }
}
/* Check for Windows shortcut of same name. */
d += ".lnk";
- dw = GetFileAttributes (d.c_str());
- if (dw != INVALID_FILE_ATTRIBUTES
- && !(dw & FILE_ATTRIBUTE_DIRECTORY))
+ if (IsWindowsNT ())
+ {
+ wcscat (wname, L".lnk");
+ DWORD dw = GetFileAttributesW (wname);
+ if (dw != INVALID_FILE_ATTRIBUTES
+ && !(dw & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ log (LOG_BABBLE) << "unlink " << d << endLog;
+ SetFileAttributesW (wname, dw & ~FILE_ATTRIBUTE_READONLY);
+ DeleteFileW (wname);
+ }
+ }
+ else
{
- log (LOG_BABBLE) << "unlink " << d << endLog;
- SetFileAttributes (d.c_str(),
- dw & ~FILE_ATTRIBUTE_READONLY);
- DeleteFile (d.c_str());
+ DWORD dw = GetFileAttributesA (d.c_str());
+ if (dw != INVALID_FILE_ATTRIBUTES
+ && !(dw & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ log (LOG_BABBLE) << "unlink " << d << endLog;
+ SetFileAttributesA (d.c_str(), dw & ~FILE_ATTRIBUTE_READONLY);
+ DeleteFileA (d.c_str());
+ }
}
line = installed.getnextfile ();
}
{
it--;
std::string d = cygpath("/" + *it);
- if (RemoveDirectory (d.c_str()))
+ WCHAR wname[d.size () + 11];
+ if (IsWindowsNT ())
+ {
+ mklongpath (wname, d.c_str (), d.size () + 11);
+ if (RemoveDirectoryW (wname))
+ log (LOG_BABBLE) << "rmdir " << d << endLog;
+ }
+ else if (RemoveDirectoryA (d.c_str()))
log (LOG_BABBLE) << "rmdir " << d << endLog;
}
}