📄 panelitemopen.cpp
字号:
{
case SE_ERR_NOASSOC:
::MessageBoxW(window,
NError::MyFormatMessageW(::GetLastError()),
// L"There is no application associated with the given file name extension",
L"7-Zip", MB_OK | MB_ICONSTOP);
}
}
return hProcess;
}
void CPanel::EditItem(int index)
{
if (!_parentFolders.IsEmpty())
{
OpenItemInArchive(index, false, true, true);
return;
}
HANDLE hProcess = StartEditApplication(_currentFolderPrefix + GetItemRelPath(index), (HWND)*this);
if (hProcess != 0)
::CloseHandle(hProcess);
}
void CPanel::OpenFolderExternal(int index)
{
HANDLE hProcess = StartApplication(GetFsPath() + GetItemRelPath(index), (HWND)*this);
if (hProcess != 0)
::CloseHandle(hProcess);
}
void CPanel::OpenItem(int index, bool tryInternal, bool tryExternal)
{
CDisableTimerProcessing disableTimerProcessing1(*this);
if (!_parentFolders.IsEmpty())
{
OpenItemInArchive(index, tryInternal, tryExternal, false);
return;
}
UString name = GetItemRelPath(index);
if (IsNameVirus(name))
{
MessageBoxMyError(virusMessage);
return;
}
UString fullPath = _currentFolderPrefix + name;
if (tryInternal)
if (!tryExternal || !DoItemAlwaysStart(name))
if (OpenItemAsArchive(index) == S_OK)
return;
if (tryExternal)
{
NDirectory::MySetCurrentDirectory(_currentFolderPrefix);
HANDLE hProcess = StartApplication(fullPath, (HWND)*this);
if (hProcess != 0)
::CloseHandle(hProcess);
}
}
HRESULT CPanel::OnOpenItemChanged(const UString &folderPath, const UString &itemName)
{
CMyComPtr<IFolderOperations> folderOperations;
if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK)
{
MessageBox(LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208));
return E_FAIL;
}
UStringVector fileNames;
CRecordVector<const wchar_t *> fileNamePointers;
fileNames.Add(itemName);
fileNamePointers.Add(fileNames[0]);
UString pathPrefix = folderPath;
NName::NormalizeDirPathPrefix(pathPrefix);
return folderOperations->CopyFrom(pathPrefix, &fileNamePointers.Front(),fileNamePointers.Size(), NULL);
}
LRESULT CPanel::OnOpenItemChanged(LPARAM lParam)
{
CTmpProcessInfo &tmpProcessInfo = *(CTmpProcessInfo *)lParam;
// LoadCurrentPath()
if (tmpProcessInfo.FullPathFolderPrefix != _currentFolderPrefix)
return 0;
CSelectedState state;
SaveSelectedState(state);
HRESULT result = OnOpenItemChanged(tmpProcessInfo.FolderPath, tmpProcessInfo.ItemName);
if (result != S_OK)
return 0;
RefreshListCtrl(state);
return 1;
}
/*
class CTmpProcessInfoList
{
public:
CObjectVector<CTmpProcessInfo> _items;
} g_TmpProcessInfoList;
*/
class CExitEventLauncher
{
public:
NWindows::NSynchronization::CManualResetEvent _exitEvent;
CExitEventLauncher()
{
if (_exitEvent.Create(false) != S_OK)
throw 9387173;
};
~CExitEventLauncher() { _exitEvent.Set(); }
} g_ExitEventLauncher;
static THREAD_FUNC_DECL MyThreadFunction(void *param)
{
CMyAutoPtr<CTmpProcessInfo> tmpProcessInfoPtr((CTmpProcessInfo *)param);
CTmpProcessInfo *tmpProcessInfo = tmpProcessInfoPtr.get();
HANDLE hProcess = tmpProcessInfo->ProcessHandle;
HANDLE events[2] = { g_ExitEventLauncher._exitEvent, hProcess};
DWORD waitResult = ::WaitForMultipleObjects(2, events, FALSE, INFINITE);
::CloseHandle(hProcess);
if (waitResult == WAIT_OBJECT_0 + 0)
return 0;
if (waitResult != WAIT_OBJECT_0 + 1)
return 1;
Sleep(200);
NFind::CFileInfoW newFileInfo;
if (NFind::FindFile(tmpProcessInfo->FilePath, newFileInfo))
{
if (newFileInfo.Size != tmpProcessInfo->FileInfo.Size ||
CompareFileTime(&newFileInfo.LastWriteTime,
&tmpProcessInfo->FileInfo.LastWriteTime) != 0)
{
UString message = MyFormatNew(IDS_WANT_UPDATE_MODIFIED_FILE,
0x03020280, tmpProcessInfo->ItemName);
if (::MessageBoxW(g_HWND, message, L"7-Zip", MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
{
if (SendMessage(tmpProcessInfo->Window, kOpenItemChanged, 0, (LONG_PTR)tmpProcessInfo) != 1)
{
::MessageBoxW(g_HWND, MyFormatNew(IDS_CANNOT_UPDATE_FILE,
0x03020281, tmpProcessInfo->FilePath), L"7-Zip", MB_OK | MB_ICONSTOP);
return 0;
}
}
}
}
tmpProcessInfo->DeleteDirAndFile();
return 0;
}
void CPanel::OpenItemInArchive(int index, bool tryInternal, bool tryExternal,
bool editMode)
{
const UString name = GetItemName(index);
if (IsNameVirus(name))
{
MessageBoxMyError(virusMessage);
return;
}
CMyComPtr<IFolderOperations> folderOperations;
if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK)
{
MessageBox(LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208));
return;
}
NFile::NDirectory::CTempDirectoryW tempDirectory;
tempDirectory.Create(kTempDirPrefix);
UString tempDir = tempDirectory.GetPath();
UString tempDirNorm = tempDir;
NFile::NName::NormalizeDirPathPrefix(tempDirNorm);
CRecordVector<UInt32> indices;
indices.Add(index);
UStringVector messages;
HRESULT result = CopyTo(indices, tempDirNorm, false, true, &messages);
if (!messages.IsEmpty())
return;
if (result != S_OK)
{
if (result != E_ABORT)
MessageBoxError(result);
return;
}
UString tempFilePath = tempDirNorm + name;
CMyAutoPtr<CTmpProcessInfo> tmpProcessInfoPtr(new CTmpProcessInfo());
CTmpProcessInfo *tmpProcessInfo = tmpProcessInfoPtr.get();
tmpProcessInfo->FolderPath = tempDir;
tmpProcessInfo->FilePath = tempFilePath;
if (!NFind::FindFile(tempFilePath, tmpProcessInfo->FileInfo))
return;
if (tryInternal)
{
if (!tryExternal || !DoItemAlwaysStart(name))
{
bool encrypted;
if (OpenItemAsArchive(name, tempDir, tempFilePath, encrypted) == S_OK)
{
RefreshListCtrl();
return;
}
}
}
CTmpProcessInfoRelease tmpProcessInfoRelease(*tmpProcessInfo);
if (!tryExternal)
return;
HANDLE hProcess;
if (editMode)
hProcess = StartEditApplication(tempFilePath, (HWND)*this);
else
hProcess = StartApplication(tempFilePath, (HWND)*this);
if (hProcess == 0)
return;
tmpProcessInfo->Window = (HWND)(*this);
tmpProcessInfo->FullPathFolderPrefix = _currentFolderPrefix;
tmpProcessInfo->ItemName = name;
tmpProcessInfo->ProcessHandle = hProcess;
NWindows::CThread thread;
if (thread.Create(MyThreadFunction, tmpProcessInfo) != S_OK)
throw 271824;
tempDirectory.DisableDeleting();
tmpProcessInfoPtr.release();
tmpProcessInfoRelease._needDelete = false;
}
/*
static const UINT64 kTimeLimit = UINT64(10000000) * 3600 * 24;
static bool CheckDeleteItem(UINT64 currentFileTime, UINT64 folderFileTime)
{
return (currentFileTime - folderFileTime > kTimeLimit &&
folderFileTime - currentFileTime > kTimeLimit);
}
void DeleteOldTempFiles()
{
UString tempPath;
if(!NFile::NDirectory::MyGetTempPath(tempPath))
throw 1;
SYSTEMTIME systemTime;
::GetSystemTime(&systemTime);
UINT64 currentFileTime;
if(!::SystemTimeToFileTime(&systemTime, (FILETIME *)¤tFileTime))
throw 2;
UString searchWildCard = tempPath + kTempDirPrefix + L"*.tmp";
searchWildCard += WCHAR(NName::kAnyStringWildcard);
NFind::CEnumeratorW enumerator(searchWildCard);
NFind::CFileInfoW fileInfo;
while(enumerator.Next(fileInfo))
{
if (!fileInfo.IsDirectory())
continue;
const UINT64 &creationTime = *(const UINT64 *)(&fileInfo.CreationTime);
if(CheckDeleteItem(creationTime, currentFileTime))
RemoveDirectoryWithSubItems(tempPath + fileInfo.Name);
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -