Как не надо кодить операцию перемещения файла (между дисками):
// перемещение файла src на место dst (упрощено)
function move(src, dst) {
int ret = copy(src, dst); // копируем на новое место
if (ret == NO_ERROR) {
ret = remove(src); // удаляем старый файл
if (ret == ANY_ERROR) { // удалить старый не получилось
remove(dst); // поэтому УДАЛЯЕМ НОВЫЙ ФАЙЛ, WTF^2
}
}
}
Т.е. если по
любой причине старый файл удалить не получилось (хинт: старый файл может уже не существовать), оно вместо этого удаляет новый файл.
Тем не менее, mod_dav_fs в Apache 2.2.11 делает именно это (см. modules/dav/fs/repos.c, line 417-438). Еще и в лог сука пишет "Could not remove source file after move. Destination was removed to ensure consistency."
Несколько файлов были потеряны при перемещении через WebDAV, после чего я пропатчил этот модуль, путем выкидывание кода, соответствующего
remove(dst).
Кстати, сборка модулей апача под винду - та еще ж.; использую VС++6, потому что внятных решений для VS2003+ не нашел).
А еще из mod_dav на винде память утекает рекой.
А про дружбу встроенного в винду WebDAV клиента с апачевским mod_dav без мата не расскажешь (тут правда винда сама виновата).
Туго на винде с WebDAV серверами, очень туго. Почему так мало WebDAV серверов? (Я нагуглил всего 3, включая апач и IIS.)