28 const char* wfs_file_base::io_type()
const
35 DWORD dwDesiredAccess = 0;
36 DWORD dwShareMode = 0;
37 DWORD dwCreationDisposition = 0;
38 DWORD dwFlagsAndAttributes = 0;
40 if (mode & file::RDONLY)
42 dwFlagsAndAttributes |= FILE_ATTRIBUTE_READONLY;
43 dwDesiredAccess |= GENERIC_READ;
46 if (mode & file::WRONLY)
48 dwDesiredAccess |= GENERIC_WRITE;
51 if (mode & file::RDWR)
53 dwDesiredAccess |= (GENERIC_READ | GENERIC_WRITE);
56 if (mode & file::CREAT)
61 if (mode & file::TRUNC)
63 dwCreationDisposition |= TRUNCATE_EXISTING;
67 dwCreationDisposition |= OPEN_ALWAYS;
70 if (mode & file::DIRECT)
72 #if !STXXL_DIRECT_IO_OFF
73 dwFlagsAndAttributes |= FILE_FLAG_NO_BUFFERING;
76 if (mode & file::REQUIRE_DIRECT) {
77 STXXL_ERRMSG(
"Error: open()ing " << filename <<
" with DIRECT mode required, but the system does not support it.");
78 file_des = INVALID_HANDLE_VALUE;
82 STXXL_MSG(
"Warning: open()ing " << filename <<
" without DIRECT mode, as the system does not support it.");
87 if (mode & file::SYNC)
92 HANDLE file_des = ::CreateFile(filename.c_str(), dwDesiredAccess, dwShareMode, NULL,
93 dwCreationDisposition, dwFlagsAndAttributes, NULL);
95 if (file_des != INVALID_HANDLE_VALUE)
98 #if !STXXL_DIRECT_IO_OFF
99 if ((mode& file::DIRECT) && !(mode & file::REQUIRE_DIRECT))
101 STXXL_MSG(
"CreateFile() error on path=" << filename <<
" mode=" << mode <<
", retrying without DIRECT mode.");
103 dwFlagsAndAttributes &= ~FILE_FLAG_NO_BUFFERING;
105 HANDLE file_des = ::CreateFile(filename.c_str(), dwDesiredAccess, dwShareMode, NULL,
106 dwCreationDisposition, dwFlagsAndAttributes, NULL);
108 if (file_des != INVALID_HANDLE_VALUE)
116 wfs_file_base::wfs_file_base(
117 const std::string& filename,
118 int mode) : file_des(INVALID_HANDLE_VALUE), mode_(mode), filename(filename), locked(false)
129 char buf[32768], * part;
130 if (!GetFullPathName(filename.c_str(),
sizeof(buf), buf, &part))
132 STXXL_ERRMSG(
"wfs_file_base::wfs_file_base(): GetFullPathName() error for file " << filename);
138 DWORD bytes_per_sector_;
139 if (!GetDiskFreeSpace(buf, NULL, &bytes_per_sector_, NULL, NULL))
141 STXXL_ERRMSG(
"wfs_file_base::wfs_file_base(): GetDiskFreeSpace() error for path " << buf);
159 if (
file_des == INVALID_HANDLE_VALUE)
173 if (LockFile(
file_des, 0, 0, 0xffffffff, 0xffffffff) == 0)
180 LARGE_INTEGER result;
181 if (!GetFileSizeEx(
file_des, &result))
184 return result.QuadPart;
200 LARGE_INTEGER desired_pos;
201 desired_pos.QuadPart = newsize;
204 if (direct_with_bad_size)
213 if (!SetFilePointerEx(
file_des, desired_pos, NULL, FILE_BEGIN))
215 "SetFilePointerEx() in wfs_file_base::set_size(..) oldsize=" << cur_size <<
216 " newsize=" << newsize <<
" ");
220 " newsize=" << newsize <<
" ");
222 if (direct_with_bad_size)
241 #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 aquire 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