Fixed: Error 18 when moving a file between different file systems
--HG-- branch : develop
This commit is contained in:
parent
9ba0ac65ea
commit
2e02f20c83
1 changed files with 27 additions and 5 deletions
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue