parent
9d09ee818a
commit
4e1a3eef4a
|
@ -92,18 +92,56 @@ void Win32_IO_File::close()
|
||||||
{
|
{
|
||||||
if (isOpened())
|
if (isOpened())
|
||||||
{
|
{
|
||||||
|
NppParameters& nppParam = NppParameters::getInstance();
|
||||||
|
|
||||||
DWORD flushError = NOERROR;
|
DWORD flushError = NOERROR;
|
||||||
if (_written)
|
if (_written)
|
||||||
{
|
{
|
||||||
if (!::FlushFileBuffers(_hFile))
|
if (!::FlushFileBuffers(_hFile))
|
||||||
|
{
|
||||||
flushError = ::GetLastError();
|
flushError = ::GetLastError();
|
||||||
|
|
||||||
|
if (!nppParam.isEndSessionCritical())
|
||||||
|
{
|
||||||
|
// because of there is not an externally forced shutdown/restart of Windows in progress,
|
||||||
|
// we can at least alert the user that the file data could not actually be saved
|
||||||
|
|
||||||
|
std::wstring curFilePath;
|
||||||
|
const DWORD cchPathBuf = MAX_PATH + 128;
|
||||||
|
WCHAR pathbuf[cchPathBuf]{};
|
||||||
|
// the dwFlags used below are the most error-proof and informative
|
||||||
|
DWORD dwRet = ::GetFinalPathNameByHandle(_hFile, pathbuf, cchPathBuf, FILE_NAME_OPENED | VOLUME_NAME_NT);
|
||||||
|
if ((dwRet == 0) || (dwRet >= cchPathBuf))
|
||||||
|
{
|
||||||
|
// probably insufficient path-buffer length, the classic style must suffice
|
||||||
|
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
|
||||||
|
curFilePath = converter.from_bytes(_path);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// ok
|
||||||
|
// - the chosen file path style here will allow us to also see the MS MUP (multiple UNC provider) style path
|
||||||
|
// for a possible network drive mapped here as the usual disk-letter, e.g.:
|
||||||
|
// "\Device\Mup\NETWORK_SERVER_DNS_NAME_OR_IP\SERVER_PATH\FILENAME"
|
||||||
|
// "\Device\Mup\NETWORK_SERVER_DNS_NAME_OR_IP@SSL@PORT_NUMBER\DavWWWRoot\SERVER_PATH\FILENAME"
|
||||||
|
// - classic local disk will be visible here like: "\Device\HarddiskVolume2\ABSOLUTE_PATH_WITHOUT_DRIVENAME\FILENAME"
|
||||||
|
curFilePath = pathbuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring errMsg = L"Notepad++ has encountered a serious system problem while saving:\n\n";
|
||||||
|
errMsg += curFilePath;
|
||||||
|
errMsg += L"\n\nThat file, temporarily stored in the system cache, cannot be finally committed to the storage device selected! \
|
||||||
|
This is probably a storage driver or hardware issue, beyond the control of the Notepad++. \
|
||||||
|
Please try using another storage and also check if your saved data is not corrupted.\n\nError Code reported: ";
|
||||||
|
errMsg += std::to_wstring(flushError) + L" - " + GetLastErrorAsString(flushError);
|
||||||
|
::MessageBoxW(NULL, errMsg.c_str(), L"WARNING - filebuffer flushing fail!", MB_OK | MB_ICONWARNING | MB_SYSTEMMODAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
::CloseHandle(_hFile);
|
::CloseHandle(_hFile);
|
||||||
|
|
||||||
_hFile = INVALID_HANDLE_VALUE;
|
_hFile = INVALID_HANDLE_VALUE;
|
||||||
|
|
||||||
|
|
||||||
NppParameters& nppParam = NppParameters::getInstance();
|
|
||||||
if (nppParam.isEndSessionStarted() && nppParam.doNppLogNulContentCorruptionIssue())
|
if (nppParam.isEndSessionStarted() && nppParam.doNppLogNulContentCorruptionIssue())
|
||||||
{
|
{
|
||||||
generic_string issueFn = nppLogNulContentCorruptionIssue;
|
generic_string issueFn = nppLogNulContentCorruptionIssue;
|
||||||
|
@ -111,7 +149,6 @@ void Win32_IO_File::close()
|
||||||
generic_string nppIssueLog = nppParam.getUserPath();
|
generic_string nppIssueLog = nppParam.getUserPath();
|
||||||
pathAppend(nppIssueLog, issueFn);
|
pathAppend(nppIssueLog, issueFn);
|
||||||
|
|
||||||
|
|
||||||
std::string msg;
|
std::string msg;
|
||||||
if (flushError != NOERROR)
|
if (flushError != NOERROR)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue