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);
}