same thing but for windows (except checking if the file is fully allocated)
This commit is contained in:
parent
247bd9256d
commit
ad5b0497c3
28
src/file.cpp
28
src/file.cpp
|
@ -1448,13 +1448,32 @@ namespace libtorrent
|
||||||
|
|
||||||
#ifdef TORRENT_WINDOWS
|
#ifdef TORRENT_WINDOWS
|
||||||
LARGE_INTEGER offs;
|
LARGE_INTEGER offs;
|
||||||
offs.QuadPart = s;
|
LARGE_INTEGER cur_size;
|
||||||
if (SetFilePointerEx(m_file_handle, offs, &offs, FILE_BEGIN) == FALSE)
|
if (GetFileSizeEx(m_file_handle, cur_size) == FALSE)
|
||||||
{
|
{
|
||||||
ec.assign(GetLastError(), get_system_category());
|
ec.assign(GetLastError(), get_system_category());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
offs.QuadPart = s;
|
||||||
|
// only set the file size if it's not already at
|
||||||
|
// the right size. We don't want to update the
|
||||||
|
// modification time if we don't have to
|
||||||
|
if (cur_size.QuadPart != s)
|
||||||
|
{
|
||||||
|
if (SetFilePointerEx(m_file_handle, offs, &offs, FILE_BEGIN) == FALSE)
|
||||||
|
{
|
||||||
|
ec.assign(GetLastError(), get_system_category());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (::SetEndOfFile(m_file_handle) == FALSE)
|
||||||
|
{
|
||||||
|
ec.assign(GetLastError(), get_system_category());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
#if _WIN32_WINNT >= 0x501
|
#if _WIN32_WINNT >= 0x501
|
||||||
|
// TODO: again, only allocate the space if the file
|
||||||
|
// is not fully allocated
|
||||||
if ((m_open_mode & sparse) == 0)
|
if ((m_open_mode & sparse) == 0)
|
||||||
{
|
{
|
||||||
// if the user has permissions, avoid filling
|
// if the user has permissions, avoid filling
|
||||||
|
@ -1463,11 +1482,6 @@ namespace libtorrent
|
||||||
SetFileValidData(m_file_handle, offs.QuadPart);
|
SetFileValidData(m_file_handle, offs.QuadPart);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (::SetEndOfFile(m_file_handle) == FALSE)
|
|
||||||
{
|
|
||||||
ec.assign(GetLastError(), get_system_category());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
struct stat st;
|
struct stat st;
|
||||||
if (fstat(m_fd, &st) != 0)
|
if (fstat(m_fd, &st) != 0)
|
||||||
|
|
Loading…
Reference in New Issue