C#에서 listview 익히기
폴더를 리스트뷰에 드래그앤드롭해서 파일해시 계산하는 예제를 통해서 리스트뷰를 사용해 보겠습니다.
아래와 같은 형태로 폼뷰를 만듭니다.
리스트뷰(ListView) 해더 추가
- 리스트뷰 속성을 설정
// Set the view to show details.
file_listView.View = View.Details;
// Allow the user to edit item text.
file_listView.LabelEdit = true;
// Allow the user to rearrange columns.
file_listView.AllowColumnReorder = true;
// Display check boxes.
//logparser_listView.CheckBoxes = true;
// Select the item and subitems when selection is made.
file_listView.FullRowSelect = true;
// Display grid lines.
file_listView.GridLines = true;
// Sort the items in the list in ascending order.
//logparser_listView.Sorting = SortOrder.Ascending;
- 리스트뷰 해더를 추가합니다.
ColumnHeader columnHeader1 = new Syste m.Windows.Forms.ColumnHeader();
columnHeader1.Text = "연번"; //1열 제목 추가
file_listView.Columns.Add(columnHeader1.Text, -2, HorizontalAlignment.Left);
ColumnHeader columnHeader10 = new Syste m.Windows.Forms.ColumnHeader();
columnHeader10.Text = "파일"; //1열 제목 추가
file_listView.Columns.Add(columnHeader2.Text);
- 리스트뷰 셀 크기를 설정합니다.
// 내용에 따라 자동변환
file_listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
// 헤더에 따라 자동변환
file_listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
private void file_listview_header()
{
// Set the view to show details.
file_listView.View = View.Details;
// Allow the user to edit item text.
file_listView.LabelEdit = true;
// Allow the user to rearrange columns.
file_listView.AllowColumnReorder = true;
// Display check boxes.
//logparser_listView.CheckBoxes = true;
// Select the item and subitems when selection is made.
file_listView.FullRowSelect = true;
// Display grid lines.
file_listView.GridLines = true;
// Sort the items in the list in ascending order.
//logparser_listView.Sorting = SortOrder.Ascending;
ColumnHeader columnHeader1 = new System.Windows.Forms.ColumnHeader();
columnHeader1.Text = "연번"; //1열 제목 추가
file_listView.Columns.Add(columnHeader1.Text, -2, HorizontalAlignment.Left);
ColumnHeader columnHeader10 = new System.Windows.Forms.ColumnHeader();
columnHeader10.Text = "파일"; //1열 제목 추가
file_listView.Columns.Add(columnHeader10.Text);
// file_modify_checkBox
if (file_modify_checkBox.Checked == true)
{
ColumnHeader columnHeader2 = new System.Windows.Forms.ColumnHeader();
columnHeader2.Text = "수정일"; //1열 제목 추가
file_listView.Columns.Add(columnHeader2.Text);
}
// file_size_checkBox
if (file_size_checkBox.Checked == true)
{
ColumnHeader columnHeader3 = new System.Windows.Forms.ColumnHeader();
columnHeader3.Text = "크기"; //1열 제목 추가
file_listView.Columns.Add(columnHeader3.Text, -2, HorizontalAlignment.Right);
}
// file_path_checkBox
if (file_path_checkBox.Checked == true)
{
ColumnHeader columnHeader4 = new System.Windows.Forms.ColumnHeader();
columnHeader4.Text = "경로"; //1열 제목 추가
file_listView.Columns.Add(columnHeader4.Text, -2, HorizontalAlignment.Left);
}
// file_md5_checkBox
if (file_md5_checkBox.Checked == true)
{
ColumnHeader columnHeader5 = new System.Windows.Forms.ColumnHeader();
columnHeader5.Text = "MD5"; //1열 제목 추가
file_listView.Columns.Add(columnHeader5.Text);
}
// file_sha1_checkBox
if (file_sha1_checkBox.Checked == true)
{
ColumnHeader columnHeader6 = new System.Windows.Forms.ColumnHeader();
columnHeader6.Text = "SHA1"; //1열 제목 추가
file_listView.Columns.Add(columnHeader6.Text);
}
// file_create_checkBox
if (file_create_checkBox.Checked == true)
{
ColumnHeader columnHeader7 = new System.Windows.Forms.ColumnHeader();
columnHeader7.Text = "생성일"; //1열 제목 추가
file_listView.Columns.Add(columnHeader7.Text);
}
// file_access_checkBox
if (file_access_checkBox.Checked == true)
{
ColumnHeader columnHeader8 = new System.Windows.Forms.ColumnHeader();
columnHeader8.Text = "실행일"; //1열 제목 추가
file_listView.Columns.Add(columnHeader8.Text, -2, HorizontalAlignment.Left);
}
//file_listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
file_listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); // 헤더에 따라 자동변환
}
리스트뷰(ListView) 내용 추가
private void file_add_item(string _path)
{
var info = new FileInfo(_path);
ListViewItem item0 = new ListViewItem();
//연번
item0.Text = String.Format("{0}", file_cnt);
//파일명
item0.SubItems.Add(String.Format("{0}", info.Name));
//Log_print(String.Format("파일명: {0}", info.Name));
.....
file_listView.Items.Add(item0);
file_cnt++;
}
private void file_add_item(string _path)
{
// 파일을 만나게 되면 실제 해야할 액션을 코딩한다
//Log_print(_path);
var info = new FileInfo(_path);
ListViewItem item0 = new ListViewItem();
//연번
item0.Text = String.Format("{0}", file_cnt);
//Log_print(String.Format("연번: {0}", file_cnt));
//파일명
item0.SubItems.Add(String.Format("{0}", info.Name));
//Log_print(String.Format("파일명: {0}", info.Name));
// 수정일
// file_modify_checkBox
if (file_modify_checkBox.Checked == true)
{
item0.SubItems.Add(String.Format("{0}", info.LastWriteTime));
//Log_print(String.Format("수정일: {0}", info.LastWriteTime));
}
// 파일크기
// file_size_checkBox
if (file_size_checkBox.Checked == true)
{
//string str = string.Format("{0:#,###}", num)
item0.SubItems.Add(String.Format("{0:#,###}", info.Length));
}
// file_path_checkBox
if (file_path_checkBox.Checked == true)
{
item0.SubItems.Add(String.Format("{0}", info.FullName));
}
// file_md5_checkBox
if (file_md5_checkBox.Checked == true)
{
item0.SubItems.Add(String.Format("{0}", file_md5(_path)));
}
// file_sha1_checkBox
if (file_sha1_checkBox.Checked == true)
{
item0.SubItems.Add(String.Format("{0}", file_sha1(_path)));
}
// file_create_checkBox
if (file_create_checkBox.Checked == true)
{
item0.SubItems.Add(String.Format("{0}", info.CreationTime));
}
// file_access_checkBox
if (file_access_checkBox.Checked == true)
{
item0.SubItems.Add(String.Format("{0}", info.LastAccessTime));
}
file_listView.Items.Add(item0);
file_cnt++;
}
리스트뷰(ListView) 드래그앤드롭
①. 속성창에서 AllowDrop 을 True로 변경
②. DragEnter, DragDrop 이벤트 핸들러 추가
private void file_listView_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy | DragDropEffects.Scroll;
}
else
{
e.Effect = DragDropEffects.None;
}
}
private void file_listView_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
string[] files = e.Data.GetData(DataFormats.FileDrop, true) as string[];
Log_print("파일 해시 계산 시작!!");
file_cnt = 1;
foreach (string file in files)
{
//chkDir_recursive(file);
FileAttributes chkAtt = File.GetAttributes(file);
if ((chkAtt & FileAttributes.Directory) == FileAttributes.Directory)
{
// 디렉토리일 경우
// 루트 디렉터리와 모든 하위 디렉터리에 있는 파일 목록을 가져옵니다.
string[] tmpfiles = Directory.GetFiles(file, "*", SearchOption.AllDirectories);
//string[] tmpfiles = Directory.GetFiles(inputfoldername1, "*.*");
//Log_print(String.Format("{0}", tmpfiles));
foreach (string tempFile in tmpfiles)
{
//Log_print(tempFile);
file_add_item(tempFile);
}
}
else
{
//Log_print(String.Format("{0}", file));
//Log_print(file);
file_add_item(file);
}
}
//모든 열 사이즈 자동조절
file_listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
Log_print(String.Format("{0} 파일 해시 계산 완료!!", (file_cnt-1)));
}
else
{
Log_print("error ");
}
}
리스트뷰(ListView) 전체선택(Ctrl+A), 복사(Ctrl+C) 하기
①. KeyDown 이벤트 핸들러 추가
Ctrl + A 키를 누를때와
Ctrl + C 키를 누를때 할 행위에 대해서 정의해줍니다.
private void file_listView_KeyDown(object sender, KeyEventArgs e)
{
//콘트롤 + A 누르면
if (e.KeyCode == Keys.A && e.Control)
{
file_listView.MultiSelect = true;
foreach (ListViewItem item in file_listView.Items)
{
item.Selected = true;
}
Log_print("전체 내용 선택(Ctrl+A) 합니다.");
}
//콘트롤 + C 누르면
if (e.Control && e.KeyCode == Keys.C)
{
Log_print("전체 내용을 복사(Ctrl+C) 합니다.");
CopyListBox((System.Windows.Forms.ListView)sender);
}
}
private void CopyListBox(ListView list)
{
StringBuilder sb = new StringBuilder();
// Head 복사하기
String columnheader = "";
for (int i = 0; i < file_listView.Columns.Count; i++)
{
columnheader += file_listView.Columns[i].Text + "\t";
}
sb.Append(columnheader);
sb.AppendLine();
// 내용 복사하기
foreach (var item in list.SelectedItems)
{
ListViewItem l = item as ListViewItem;
if (l != null)
{
foreach (ListViewItem.ListViewSubItem sub in l.SubItems)
{
sb.Append(sub.Text + "\t");
}
}
sb.AppendLine();
}
Clipboard.SetDataObject(sb.ToString().Trim());
}
파일 해시 MD5, SHA1, SHA256 계산
using System.Security.Cryptography;
//--------------------------
// 파일 해시 MD5 계산
//--------------------------
private String file_md5(String FilePath)
{
return ComputeHash(FilePath, new MD5CryptoServiceProvider());
}
//--------------------------
// 파일 해시 SHA1 계산
//--------------------------
private String file_sha1(String FilePath)
{
return ComputeHash(FilePath, new SHA1CryptoServiceProvider());
}
//--------------------------
// 파일 해시 SHA256 계산
//--------------------------
private String file_sha256(String FilePath)
{
return ComputeHash(FilePath, new SHA256CryptoServiceProvider());
}
//--------------------------
// 파일 해시 계산 알고리즘
//--------------------------
private string ComputeHash(string FilePath, HashAlgorithm Algorithm)
{
FileStream FileStream = File.OpenRead(FilePath);
try
{
byte[] HashResult = Algorithm.ComputeHash(FileStream);
string ResultString = BitConverter.ToString(HashResult).Replace("-", "");
return ResultString;
}
finally
{
FileStream.Close();
}
}
파일 저장 버튼 처리
특정 ListView를 csv로 저장하는 함수
// 파일 저장 버튼 처리
private void file_save_button_Click(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
// Head 입력하기
String columnheader = "";
for (int i = 0; i < file_listView.Columns.Count; i++)
{
columnheader += file_listView.Columns[i].Text + "\t";
}
sb.Append(columnheader);
sb.AppendLine();
// 내용
foreach (var item in file_listView.Items)
{
ListViewItem l = item as ListViewItem;
if (l != null)
{
foreach (ListViewItem.ListViewSubItem sub in l.SubItems)
{
sb.Append(sub.Text + "\t");
}
}
sb.AppendLine();
}
try
{
string output_filename = "";
String out_path1 = "\\filehash_" + @DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss");
SaveFileFolder = System.IO.Directory.GetCurrentDirectory();
//output_filename = SaveFileFolder + out_path1
output_filename = String.Format("{0}{1}.csv", SaveFileFolder, out_path1);
FileDialog filedlg = new System.Windows.Forms.SaveFileDialog();
filedlg.InitialDirectory = SaveFileFolder; // 초기 저장 디렉토리, 지정하지 않으면 마지막으로 작업한 폴더를 연다
filedlg.FileName = output_filename;
filedlg.Filter = "Excel File (*.csv)|*.csv";
if (DialogResult.Cancel == filedlg.ShowDialog())
return;
if (filedlg.FileName != "")
output_filename = filedlg.FileName;
else
return;
StreamWriter sw = new StreamWriter(output_filename, true);
sw.Write(sb.ToString());
sw.Close();
Log_print("------------------------------------");
Log_print(String.Format("저장위치: {0}", output_filename));
Log_print("파일 해시 결과 저장 완료!!");
Log_print("------------------------------------");
}
catch (Exception err)
{
Log_print(err.Message);
}
}
여러 ListView 내용을 CSV 파일로 저장하는 방법
// ListView 를 CSV로 저장하기
private void ListViewExportCSV(System.Windows.Forms.ListView lv, string strFileName)
{
string filename;
FileDialog filedlg = new System.Windows.Forms.SaveFileDialog();
filedlg.FileName = strFileName;
filedlg.Filter = "Excel File (*.csv)|*.csv";
if (DialogResult.Cancel == filedlg.ShowDialog())
return;
if (filedlg.FileName != "")
filename = filedlg.FileName;
else
return;
try
{
if (File.Exists(filename))
File.Delete(filename);
StreamWriter sw = new StreamWriter(filename, false, Encoding.Unicode);
// Head 입력하기
String columnheader = "";
for (int i = 0; i < lv.Columns.Count; i++)
{
columnheader += lv.Columns[i].Text + "\t";
}
sw.WriteLine(columnheader);
string strText = "";
// 내용 입력하기
for (int i = 0; i < lv.Items.Count; i++)
{
strText = "";
for (int j = 0; j < lv.Columns.Count; j++)
{
strText += lv.Items[i].SubItems[j].Text.Replace("\r", "").Replace("\n", "") + "\t";
}
sw.WriteLine(strText);
}
sw.Close();
MessageBox.Show("저장 완료!");
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
클리어 버튼
- 리스트뷰를 클리어한다.
- 로그 박스를 클리어한다.
private void file_button_Click(object sender, EventArgs e)
{
file_listView.Clear();
file_listview_header();
file_richTextBox.Clear();
Application.DoEvents();
}
'공학속으로 > C#' 카테고리의 다른 글
[C#] DLL을 포함한 단일 EXE배포 방법 (0) | 2023.09.04 |
---|---|
C# Naver Api 사용하여 네이버 뉴스 검색하기 (1) | 2023.09.01 |
C# ChatGPT API사용하기 (0) | 2023.07.13 |
C# 리스트박스(ListBox) 사용법 (0) | 2023.07.07 |
[C#] 파일 폴더 드래그앤드롭 (0) | 2023.07.07 |
댓글