Fixed: Error 18 when moving a file between different file systems

This commit is contained in:
kervala 2016-06-04 17:00:40 +02:00
parent 9479bf3ee8
commit f6f42d7953

View file

@ -2373,13 +2373,35 @@ static bool CopyMoveFile(const std::string &dest, const std::string &src, bool c
} }
#else #else
if (rename (ssrc.c_str(), sdest.c_str()) == -1) if (rename (ssrc.c_str(), sdest.c_str()) == -1)
{
// unable to move because file systems are different
if (errno == EXDEV)
{
// different file system, we need to copy and delete file manually
if (!CopyMoveFile(dest, src, true, failIfExists, progress)) return false;
// get modification time
uint32 modificationTime = CFile::getFileModificationDate(src);
// delete original file
if (!CFile::deleteFile(src)) return false;
// set same modification time
if (!CFile::setFileModificationDate(dest, modificationTime))
{
nlwarning("Unable to set modification time %s (%u) for %s", timestampToHumanReadable(modificationTime).c_str(), modificationTime, dest.c_str());
}
}
else
{ {
nlwarning("PATH: CopyMoveFile error: can't rename '%s' into '%s', error %u", nlwarning("PATH: CopyMoveFile error: can't rename '%s' into '%s', error %u",
ssrc.c_str(), ssrc.c_str(),
sdest.c_str(), sdest.c_str(),
errno); errno);
return false; return false;
} }
}
#endif #endif
} }
if (progress) progress->progress(1.f); if (progress) progress->progress(1.f);