summaryrefslogtreecommitdiff
path: root/shared/file_io.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'shared/file_io.cpp')
-rw-r--r--shared/file_io.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/shared/file_io.cpp b/shared/file_io.cpp
index 2614ac06..59b78044 100644
--- a/shared/file_io.cpp
+++ b/shared/file_io.cpp
@@ -23,7 +23,7 @@ FileInput::FileInput(FileHandle handle, const Zstring& filename) :
filename_(filename) {}
-FileInput::FileInput(const Zstring& filename) : //throw (FileError, ErrorNotExisting)
+FileInput::FileInput(const Zstring& filename) : //throw FileError, ErrorNotExisting
eofReached(false),
filename_(filename)
{
@@ -31,7 +31,7 @@ FileInput::FileInput(const Zstring& filename) : //throw (FileError, ErrorNotExi
fileHandle = ::CreateFile(zen::applyLongPathPrefix(filename).c_str(),
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //all shared modes are required to read open files that are shared by other applications
- NULL,
+ 0,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
/* possible values: (Reference http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx#caching_behavior)
@@ -112,7 +112,7 @@ size_t FileInput::read(void* buffer, size_t bytesToRead) //returns actual number
const size_t bytesRead = ::fread(buffer, 1, bytesToRead, fileHandle);
if (::ferror(fileHandle) != 0)
#endif
- throw FileError(_("Error reading file:") + "\n\"" + filename_ + "\"" + "\n\n" + zen::getLastErrorFormatted());
+ throw FileError(_("Error reading file:") + "\n\"" + filename_ + "\"" + "\n\n" + zen::getLastErrorFormatted() + " (r)");
#ifdef FFS_WIN
if (bytesRead < bytesToRead) //falsify only!
@@ -137,14 +137,19 @@ bool FileInput::eof() //end of file reached
FileOutput::FileOutput(FileHandle handle, const Zstring& filename) : fileHandle(handle), filename_(filename) {}
-FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw (FileError, ErrorTargetPathMissing, ErrorTargetExisting)
+FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting
filename_(filename)
{
#ifdef FFS_WIN
fileHandle = ::CreateFile(zen::applyLongPathPrefix(filename).c_str(),
- GENERIC_WRITE,
+ GENERIC_READ | GENERIC_WRITE,
+ /* http://msdn.microsoft.com/en-us/library/aa363858(v=vs.85).aspx
+ quote: When an application creates a file across a network, it is better
+ to use GENERIC_READ | GENERIC_WRITE for dwDesiredAccess than to use GENERIC_WRITE alone.
+ The resulting code is faster, because the redirector can use the cache manager and send fewer SMBs with more data.
+ This combination also avoids an issue where writing to a file across a network can occasionally return ERROR_ACCESS_DENIED. */
FILE_SHARE_READ | FILE_SHARE_DELETE, //note: FILE_SHARE_DELETE is required to rename file while handle is open!
- NULL,
+ 0,
access == ACC_OVERWRITE ? CREATE_ALWAYS : CREATE_NEW,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
@@ -192,7 +197,7 @@ FileOutput::~FileOutput()
}
-void FileOutput::write(const void* buffer, size_t bytesToWrite) //throw (FileError)
+void FileOutput::write(const void* buffer, size_t bytesToWrite) //throw FileError
{
#ifdef FFS_WIN
DWORD bytesWritten = 0;
bgstack15