mfc_Drag_Drop_2 - 8BitsCoding/RobotMentor GitHub Wiki


void CMFCApplication1Dlg::OnDropFiles(HDROP hDropInfo)
{
	m_drop_list.ResetContent();

	int count = DragQueryFile(hDropInfo, 0xFFFFFFFF/*-1*/, NULL, 0);

	wchar_t temp_path[MAX_PATH];
	for (int i = 0; i < count; i++) {
		DragQueryFile(hDropInfo, i, temp_path, MAX_PATH);
		m_drop_list.InsertString(i, temp_path);
		/*
		if (GetFileAttributes(temp_path) & FILE_ATTRIBUTE_DIRECTORY) {
			// 디렉토리라면 1
			m_drop_list.SetItemData(i, 1);
		}
		else {
			// 파일이라면 0
			m_drop_list.SetItemData(i, 0);
		}
		*/
		// 소스간단화
		m_drop_list.SetItemData(i, (GetFileAttributes(temp_path) & FILE_ATTRIBUTE_DIRECTORY) >> 4);
	}

	MakeFileList();

	CDialogEx::OnDropFiles(hDropInfo);
}
void CMFCApplication1Dlg::MakeFileList()
{
	int is_continue, count, i;
	wchar_t temp_path[MAX_PATH];

	do {
		is_continue = 0;
		count = m_drop_list.GetCount();
		for (i = 0; i < count; i++) {
			if (m_drop_list.GetItemData(i) == 1) {
				// 디렉터리 발견
				m_drop_list.SetItemData(i, 2);
				m_drop_list.GetText(i, temp_path);
				GetFileInDirectory(temp_path, i + 1);
				is_continue = 1;
				break;
			}
		}
	} while (is_continue);
}
void CMFCApplication1Dlg::GetFileInDirectory(wchar_t * ap_path, int a_insert_index)
{
	CString path, file_path;
	WIN32_FIND_DATA file_data;

	path.Format(L"%s\\*.*", ap_path);
	HANDLE h_item_list = FindFirstFile(path, &file_data);
	if (INVALID_HANDLE_VALUE != h_item_list) {
		do {
			// ".", ".." 모두 출력됨
			// 배제하는 코드 추가
			if (memcmp(file_data.cFileName, L".", 4) && memcmp(file_data.cFileName, L"..", 6)) {	
				// . : 유니코드이고 NULL 문자를 포함하기에 4바이트
				file_path.Format(L"%s\\%s", ap_path, file_data.cFileName);
				m_drop_list.InsertString(a_insert_index, file_path);
				m_drop_list.SetItemData(a_insert_index, (file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) >> 4);

			}
		} while (FindNextFile(h_item_list, &file_data));
	}
}