mfc_file_manage_5 - 8BitsCoding/RobotMentor GitHub Wiki
ListBox์ Has String์ False๋ก ๋ณ๊ฒฝํ๋ค.
typedef struct FileItemInformation
{
unsigned int attr;
unsigned int h_size;
unsigned int l_size;
wchar_t * p_name;
unsigned short name_len;
} FII;
// Dlg.h
TW_FileListBox m_left_list;
TW_FileListBox m_right_list;
void CMFCApplication1Dlg::ResetFII(CListBox* ap_list_box)
{
int count = ap_list_box->GetCount();
FII * p;
for (int i = 0; i < count; i++) {
p = (FII*)ap_list_box->GetItemDataPtr(i);
delete p->p_name;
delete p;
}
ap_list_box->ResetContent();
}
void CMFCApplication1Dlg::DirToList(CListBox* ap_list_box, CString a_path)
{
// ๊ธฐ์กดํญ๋ชฉ์ ๊ฑฐ
// ap_list_box->ResetContent();
ResetFII(ap_list_box);
WIN32_FIND_DATA file_data;
a_path += L"\\";
HANDLE h_file_list = FindFirstFile(a_path+L"*.*", &file_data);
if (h_file_list != INVALID_HANDLE_VALUE) {
int dir_index = 0, file_index = 0;
FII *p;
do {
if (!(file_data.cFileName[0] == '.' && file_data.cFileName[1] == 0)) {// *.* ํฐ๋ ํ ๋ฆฌ ์ ์ธํ๊ธฐ
p = new FII;
p->attr = file_data.dwFileAttributes;
p->h_size = file_data.nFileSizeHigh;
p->l_size = file_data.nFileSizeLow;
p->name_len = (unsigned short)wcslen(file_data.cFileName);
p->p_name = new wchar_t[p->name_len + 1];
memcpy(p->p_name, file_data.cFileName, (p->name_len + 1) << 1 /* `*2ํจ๊ณผ` */);
if (file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
ap_list_box->InsertString(dir_index, L"");
ap_list_box->SetItemDataPtr(dir_index++, p);
}
else {
ap_list_box->InsertString(dir_index + file_index, L"");
ap_list_box->SetItemDataPtr(dir_index + file_index++, p);
}
}
} while (FindNextFile(h_file_list, &file_data));
FindClose(h_file_list);
}
}
void CMFCApplication1Dlg::ChangeDir(CListBox * ap_list_box, int a_path_ctrl_id)
{
CString path;
int index = ap_list_box->GetCurSel();
FII * p = (FII*)ap_list_box->GetItemDataPtr(index);
if (p->attr & FILE_ATTRIBUTE_DIRECTORY) { // ๋๋ ํฐ๋ฆฌ
GetDlgItemText(a_path_ctrl_id, path);
if (p->name_len == 2 && !memcmp(p->p_name, L"..", 4)) { // 4bytes๋ฅผ ๋น๊ตํ๋ ์ด์ ๋ ์ ๋์ฝ๋๋ผ์ ํ ๋ฌธ์๋น 2๋ฐ์ดํธ
path.TrimRight('\\');
int pos = path.ReverseFind('\\');
path.Delete(pos + 1, path.GetLength() - pos - 1);
}
else {
// ex. c:\temp\ + aa -> c:\temp\aa
path += L"\\";
path += p->p_name;
// ex. c:\temp\aa -> c:\temp\aa\
//path += L"\\";
}
SetDlgItemText(a_path_ctrl_id, path);
DirToList(ap_list_box, path);
}
}
void CMFCApplication1Dlg::OnBnClickedLToRCopyBtn()
{
int index = m_left_list.GetCurSel();
if (index != LB_ERR) {
CString src_path, dest_path;
FII * p = (FII*)m_left_list.GetItemDataPtr(index);
if(p->attr & FILE_ATTRIBUTE_DIRECTORY) {
// ๋๋ ํฐ๋ฆฌ๋ ๋ณต์ฌํ์ง ์์
MessageBox(L"๋๋ ํ ๋ฆฌ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.", L"๋ณต์ฌ ์คํจ", MB_ICONSTOP|MB_OK);
}
else {
GetDlgItemText(IDC_L_PATH_EDIT, src_path);
GetDlgItemText(IDC_R_PATH_EDIT, dest_path);
CopyFile(src_path +L"\\" + p->p_name, dest_path + L"\\" + p->p_name, FALSE);
// ๋ง์ง๋ง FALSE๋ ๋ฎ์ด์ฐ๊ฒ ๋์ง? FALSE์ผ๊ฒฝ์ฐ ๋ฎ์ด์ด๋ค.
DirToList(&m_right_list, dest_path);
}
}
}
void CMFCApplication1Dlg::OnBnClickedRDleBtn()
{
int index = m_right_list.GetCurSel();
if (index != LB_ERR) {
FII * p = (FII*)m_left_list.GetItemDataPtr(index);
if(p->attr & FILE_ATTRIBUTE_DIRECTORY) {
// ๋๋ ํฐ๋ฆฌ ์ญ์ ์ํจ
MessageBox(L"๋๋ ํ ๋ฆฌ๋ ์ญ์ ํ ์ ์์ต๋๋ค.", L"์ญ์ ์คํจ", MB_ICONSTOP | MB_OK);
}
else {
if (IDOK == MessageBox(p->p_name, L"์๋์ ํ์ผ์ ์ญ์ ํ์๊ฒ ์ต๋๊น?", MB_ICONQUESTION | MB_OKCANCEL))
{
CString path;
GetDlgItemText(IDC_R_PATH_EDIT, path);
DeleteFile(path + p->p_name);
DirToList(&m_right_list, path);
}
}
}
}
void CMFCApplication1Dlg::OnDestroy()
{
CDialogEx::OnDestroy();
ResetFII(&m_left_list);
ResetFII(&m_right_list);
}