You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
4.0 KiB
147 lines
4.0 KiB
#include "src/impl.h"
|
|
#include "libplatform/impl.h" /* for platform_win32_impl.h which declares Utf8ToFilename */
|
|
#include <windows.h>
|
|
|
|
namespace mp4v2 {
|
|
using namespace impl;
|
|
}
|
|
|
|
namespace mp4v2 { namespace platform { namespace io {
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
static DWORD getAttributes ( string path_ );
|
|
|
|
/**
|
|
* Call GetFileAttributesW throw exceptions for errors
|
|
*
|
|
* @param path_ the path to get attributes for
|
|
*
|
|
* @retval INVALID_FILE_ATTRIBUTES @p path_ doesn't exist
|
|
* @retval anything else the attributes of @p path_
|
|
*/
|
|
static DWORD
|
|
getAttributes ( string path_ )
|
|
{
|
|
win32::Utf8ToFilename filename(path_);
|
|
|
|
if (!filename.IsUTF16Valid())
|
|
{
|
|
// throw an exception to avoid changing the
|
|
// signature of this function and dealing with all
|
|
// the places it's called.
|
|
ostringstream msg;
|
|
msg << "can't convert file to UTF-16(" << filename.utf8 << ")";
|
|
throw new Exception(msg.str(),__FILE__,__LINE__,__FUNCTION__);
|
|
}
|
|
|
|
DWORD attributes = ::GetFileAttributesW(filename);
|
|
if( attributes == INVALID_FILE_ATTRIBUTES )
|
|
{
|
|
DWORD last_err = GetLastError();
|
|
|
|
// Distinguish between an error and the path not existing
|
|
if ((last_err == ERROR_FILE_NOT_FOUND) || (last_err == ERROR_PATH_NOT_FOUND))
|
|
{
|
|
return attributes;
|
|
}
|
|
|
|
// Anything else is an error
|
|
ostringstream msg;
|
|
msg << "GetFileAttributes(" << filename.utf8 << ") failed (" << last_err << ")";
|
|
throw new Exception(msg.str(),__FILE__,__LINE__,__FUNCTION__);
|
|
}
|
|
|
|
// path exists so return its attributes
|
|
return attributes;
|
|
}
|
|
|
|
bool
|
|
FileSystem::exists( string path_ )
|
|
{
|
|
return( getAttributes(path_) != INVALID_FILE_ATTRIBUTES );
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
bool
|
|
FileSystem::isDirectory( string path_ )
|
|
{
|
|
DWORD attributes = getAttributes( path_ );
|
|
if( attributes == INVALID_FILE_ATTRIBUTES )
|
|
return false;
|
|
|
|
return ( ( attributes & FILE_ATTRIBUTE_DIRECTORY ) == FILE_ATTRIBUTE_DIRECTORY );
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
bool
|
|
FileSystem::isFile( string path_ )
|
|
{
|
|
DWORD attributes = getAttributes( path_ );
|
|
if( attributes == INVALID_FILE_ATTRIBUTES )
|
|
return false;
|
|
|
|
return ( ( attributes & FILE_ATTRIBUTE_DIRECTORY ) != FILE_ATTRIBUTE_DIRECTORY );
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
bool
|
|
FileSystem::getFileSize( string path_, File::Size& size_ )
|
|
{
|
|
win32::Utf8ToFilename filename(path_);
|
|
|
|
if (!filename.IsUTF16Valid())
|
|
{
|
|
// The logging is done
|
|
return true;
|
|
}
|
|
|
|
size_ = 0;
|
|
WIN32_FILE_ATTRIBUTE_DATA data = {0};
|
|
if( !GetFileAttributesExW( filename, GetFileExInfoStandard, (LPVOID)&data ) )
|
|
{
|
|
log.errorf("%s: GetFileAttributesExW(%s) failed (%d)",__FUNCTION__,filename.utf8.c_str(),
|
|
GetLastError());
|
|
return true;
|
|
}
|
|
|
|
size_ = ( (File::Size)data.nFileSizeHigh << 32 ) | data.nFileSizeLow;
|
|
return false;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
bool
|
|
FileSystem::rename( string from, string to )
|
|
{
|
|
win32::Utf8ToFilename from_file(from);
|
|
win32::Utf8ToFilename to_file(to);
|
|
|
|
if (!from_file.IsUTF16Valid() || !to_file.IsUTF16Valid())
|
|
{
|
|
return true;
|
|
}
|
|
|
|
if (!::MoveFileExW( from_file, to_file,
|
|
MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH ) )
|
|
{
|
|
log.errorf("%s: MoveFileExW(%s,%s) failed (%d)",__FUNCTION__,from_file.utf8.c_str(),to_file.utf8.c_str(),
|
|
GetLastError());
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
string FileSystem::DIR_SEPARATOR = "\\";
|
|
string FileSystem::PATH_SEPARATOR = ";";
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
}}} // namespace mp4v2::platform::io
|