mirror of
https://github.com/notepad-plus-plus/notepad-plus-plus.git
synced 2025-07-25 06:45:27 +02:00
Fix saving files loosing Alternate Data Stream issue
Fix #1498, fix #8451, fix #8013, close #14039
This commit is contained in:
parent
01ff1eb881
commit
b068aa9033
@ -16,18 +16,10 @@
|
|||||||
|
|
||||||
#include <locale>
|
#include <locale>
|
||||||
#include <codecvt>
|
#include <codecvt>
|
||||||
|
#include <shlwapi.h>
|
||||||
#include "FileInterface.h"
|
#include "FileInterface.h"
|
||||||
#include "Parameters.h"
|
#include "Parameters.h"
|
||||||
|
|
||||||
Win32_IO_File::Win32_IO_File(const char *fname)
|
|
||||||
{
|
|
||||||
if (fname)
|
|
||||||
{
|
|
||||||
_path = fname;
|
|
||||||
_hFile = ::CreateFileA(fname, _accessParam, _shareParam, NULL, _dispParam, _attribParam, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Win32_IO_File::Win32_IO_File(const wchar_t *fname)
|
Win32_IO_File::Win32_IO_File(const wchar_t *fname)
|
||||||
{
|
{
|
||||||
@ -36,7 +28,17 @@ Win32_IO_File::Win32_IO_File(const wchar_t *fname)
|
|||||||
std::wstring fn = fname;
|
std::wstring fn = fname;
|
||||||
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
|
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
|
||||||
_path = converter.to_bytes(fn);
|
_path = converter.to_bytes(fn);
|
||||||
_hFile = ::CreateFileW(fname, _accessParam, _shareParam, NULL, _dispParam, _attribParam, NULL);
|
|
||||||
|
DWORD dispParam = ::PathFileExistsW(fname) ? TRUNCATE_EXISTING : CREATE_ALWAYS;
|
||||||
|
_hFile = ::CreateFileW(fname, _accessParam, _shareParam, NULL, dispParam, _attribParam, NULL);
|
||||||
|
|
||||||
|
// Race condition management:
|
||||||
|
// If file didn't exist while calling PathFileExistsW, but before calling CreateFileW, file is created: use CREATE_ALWAYS is OK
|
||||||
|
// If file did exist while calling PathFileExistsW, but before calling CreateFileW, file is deleted: use TRUNCATE_EXISTING will cause the error
|
||||||
|
if (_hFile == INVALID_HANDLE_VALUE && ::GetLastError() == ERROR_FILE_NOT_FOUND)
|
||||||
|
{
|
||||||
|
_hFile = ::CreateFileW(fname, _accessParam, _shareParam, NULL, CREATE_ALWAYS, _attribParam, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
NppParameters& nppParam = NppParameters::getInstance();
|
NppParameters& nppParam = NppParameters::getInstance();
|
||||||
if (nppParam.isEndSessionStarted() && nppParam.doNppLogNulContentCorruptionIssue())
|
if (nppParam.isEndSessionStarted() && nppParam.doNppLogNulContentCorruptionIssue())
|
||||||
@ -104,31 +106,6 @@ void Win32_IO_File::close()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
int_fast64_t Win32_IO_File::getSize()
|
|
||||||
{
|
|
||||||
LARGE_INTEGER r;
|
|
||||||
r.QuadPart = -1;
|
|
||||||
|
|
||||||
if (isOpened())
|
|
||||||
::GetFileSizeEx(_hFile, &r);
|
|
||||||
|
|
||||||
return static_cast<int_fast64_t>(r.QuadPart);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long Win32_IO_File::read(void *rbuf, unsigned long buf_size)
|
|
||||||
{
|
|
||||||
if (!isOpened() || (rbuf == nullptr) || (buf_size == 0))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
DWORD bytes_read = 0;
|
|
||||||
|
|
||||||
if (::ReadFile(_hFile, rbuf, buf_size, &bytes_read, NULL) == FALSE)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return bytes_read;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool Win32_IO_File::write(const void *wbuf, size_t buf_size)
|
bool Win32_IO_File::write(const void *wbuf, size_t buf_size)
|
||||||
{
|
{
|
||||||
|
@ -42,8 +42,6 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
void close();
|
void close();
|
||||||
//int_fast64_t getSize();
|
|
||||||
//unsigned long read(void *rbuf, unsigned long buf_size);
|
|
||||||
|
|
||||||
bool write(const void *wbuf, size_t buf_size);
|
bool write(const void *wbuf, size_t buf_size);
|
||||||
|
|
||||||
@ -58,6 +56,5 @@ private:
|
|||||||
|
|
||||||
const DWORD _accessParam { GENERIC_READ | GENERIC_WRITE };
|
const DWORD _accessParam { GENERIC_READ | GENERIC_WRITE };
|
||||||
const DWORD _shareParam { FILE_SHARE_READ | FILE_SHARE_WRITE };
|
const DWORD _shareParam { FILE_SHARE_READ | FILE_SHARE_WRITE };
|
||||||
const DWORD _dispParam { CREATE_ALWAYS };
|
|
||||||
const DWORD _attribParam { FILE_ATTRIBUTE_NORMAL };
|
const DWORD _attribParam { FILE_ATTRIBUTE_NORMAL };
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user