fs/FileSystem: RenameFile() throws exception on error

This commit is contained in:
Max Kellermann 2016-12-04 19:59:33 +01:00
parent dee6e498d9
commit 6caf53d1c2
3 changed files with 27 additions and 30 deletions

View File

@ -122,24 +122,6 @@ spl_map_to_fs(const char *name_utf8)
return path_fs;
}
/**
* Throw an exception for the current errno.
*/
static void
ThrowPlaylistErrno()
{
switch (errno) {
case ENOENT:
throw PlaylistError(PlaylistResult::NO_SUCH_LIST,
"No such playlist");
default:
throw std::system_error(std::error_code(errno,
std::system_category()),
"Error");
}
}
static bool
LoadPlaylistFileInfo(PlaylistInfo &info,
const Path parent_path_fs,
@ -392,8 +374,15 @@ spl_rename_internal(Path from_path_fs, Path to_path_fs)
throw PlaylistError(PlaylistResult::LIST_EXISTS,
"Playlist exists already");
if (!RenameFile(from_path_fs, to_path_fs))
ThrowPlaylistErrno();
try {
RenameFile(from_path_fs, to_path_fs);
} catch (const std::system_error &e) {
if (IsPathNotFound(e))
throw PlaylistError(PlaylistResult::NO_SUCH_LIST,
"No such playlist");
else
throw;
}
idle_add(IDLE_STORED_PLAYLIST);
}

View File

@ -26,6 +26,19 @@
#include <errno.h>
#include <fcntl.h>
void
RenameFile(Path oldpath, Path newpath)
{
#ifdef WIN32
if (!MoveFileEx(oldpath.c_str(), newpath.c_str(),
MOVEFILE_REPLACE_EXISTING))
throw MakeLastError("Failed to rename file");
#else
if (rename(oldpath.c_str(), newpath.c_str()) < 0)
throw MakeErrno("Failed to rename file");
#endif
}
AllocatedPath
ReadLink(Path path)
{

View File

@ -63,18 +63,13 @@ OpenFile(Path file, int flags, int mode)
#endif
}
/**
/*
* Wrapper for rename() that uses #Path names.
*
* Throws std::system_error on error.
*/
static inline bool
RenameFile(Path oldpath, Path newpath)
{
#ifdef WIN32
return _trename(oldpath.c_str(), newpath.c_str()) == 0;
#else
return rename(oldpath.c_str(), newpath.c_str()) == 0;
#endif
}
void
RenameFile(Path oldpath, Path newpath);
#ifndef WIN32