27 const char* wfs_file_base::io_type()
const
34 DWORD dwDesiredAccess = 0;
35 DWORD dwShareMode = 0;
36 DWORD dwCreationDisposition = 0;
37 DWORD dwFlagsAndAttributes = 0;
39 if (mode & file::RDONLY)
41 dwFlagsAndAttributes |= FILE_ATTRIBUTE_READONLY;
42 dwDesiredAccess |= GENERIC_READ;
45 if (mode & file::WRONLY)
47 dwDesiredAccess |= GENERIC_WRITE;
50 if (mode & file::RDWR)
52 dwDesiredAccess |= (GENERIC_READ | GENERIC_WRITE);
55 if (mode & file::CREAT)
60 if (mode & file::TRUNC)
62 dwCreationDisposition |= TRUNCATE_EXISTING;
66 dwCreationDisposition |= OPEN_ALWAYS;
69 if (mode & file::DIRECT)
71 #if !STXXL_DIRECT_IO_OFF
72 dwFlagsAndAttributes |= FILE_FLAG_NO_BUFFERING;
75 if (mode & file::REQUIRE_DIRECT) {
76 STXXL_ERRMSG(
"Error: open()ing " << filename <<
" with DIRECT mode required, but the system does not support it.");
77 return INVALID_HANDLE_VALUE;
80 STXXL_MSG(
"Warning: open()ing " << filename <<
" without DIRECT mode, as the system does not support it.");
85 if (mode & file::SYNC)
90 HANDLE file_des = ::CreateFileA(filename.c_str(), dwDesiredAccess, dwShareMode, NULL,
91 dwCreationDisposition, dwFlagsAndAttributes, NULL);
93 if (file_des != INVALID_HANDLE_VALUE)
96 #if !STXXL_DIRECT_IO_OFF
97 if ((mode& file::DIRECT) && !(mode & file::REQUIRE_DIRECT))
99 STXXL_MSG(
"CreateFile() error on path=" << filename <<
" mode=" << mode <<
", retrying without DIRECT mode.");
101 dwFlagsAndAttributes &= ~FILE_FLAG_NO_BUFFERING;
103 HANDLE file_des2 = ::CreateFileA(filename.c_str(), dwDesiredAccess, dwShareMode, NULL,
104 dwCreationDisposition, dwFlagsAndAttributes, NULL);
106 if (file_des2 != INVALID_HANDLE_VALUE)
114 wfs_file_base::wfs_file_base(
115 const std::string& filename,
116 int mode) : file_des(INVALID_HANDLE_VALUE), mode_(mode), filename(filename), locked(false)
127 char buf[32768], * part;
128 if (!GetFullPathNameA(filename.c_str(),
sizeof(buf), buf, &part))
130 STXXL_ERRMSG(
"wfs_file_base::wfs_file_base(): GetFullPathNameA() error for file " << filename);
136 DWORD bytes_per_sector_;
137 if (!GetDiskFreeSpaceA(buf, NULL, &bytes_per_sector_, NULL, NULL))
139 STXXL_ERRMSG(
"wfs_file_base::wfs_file_base(): GetDiskFreeSpaceA() error for path " << buf);
157 if (
file_des == INVALID_HANDLE_VALUE)
171 if (LockFile(
file_des, 0, 0, 0xffffffff, 0xffffffff) == 0)
178 LARGE_INTEGER result;
179 if (!GetFileSizeEx(
file_des, &result))
182 return result.QuadPart;
198 LARGE_INTEGER desired_pos;
199 desired_pos.QuadPart = newsize;
202 if (direct_with_bad_size)
211 if (!SetFilePointerEx(
file_des, desired_pos, NULL, FILE_BEGIN))
213 "SetFilePointerEx() in wfs_file_base::set_size(..) oldsize=" << cur_size <<
214 " newsize=" << newsize <<
" ");
218 " newsize=" << newsize <<
" ");
220 if (direct_with_bad_size)
239 #endif // STXXL_WINDOWS
const std::string filename
I/Os proceed bypassing file system buffers, i.e.
only writing of the file is allowed
do not acquire an exclusive lock by default
void lock()
Locks file for reading and writing (acquires a lock in the file system).
#define STXXL_THROW_WIN_LASTERROR(exception_type, error_message)
Throws exception_type with "Error in [function] : [error_message] : [formatted GetLastError()]".
only reading of the file is allowed
void close_remove()
close and remove file
offset_type bytes_per_sector
Aquire a lock that's valid until the end of scope.
#define STXXL_BEGIN_NAMESPACE
once file is opened its length becomes zero
void set_size(offset_type newsize)
offset_type size()
Returns size of the file.
request::offset_type offset_type
the offset of a request, also the size of the file
static HANDLE open_file_impl(const std::string &filename, int mode)
#define STXXL_END_NAMESPACE