2017-11-01 1 views
1

내 응용 프로그램은 Windows 탐색기처럼 작동해야 listview에서 많은 항목을 선택한 다음 treeview의 다른 디렉토리로 끌어다 놓을 수 있습니다.많은 파일을 목록보기 선택에서 C#의 다른 디렉토리로 이동

listview (1000 개의 파일을 선택한다고 가정)의 선택에서 많은 파일을 전송하려고 할 때 문제가 발생합니다. 응용 프로그램이 정지되고 몇 개의 파일 만 성공적으로 전송됩니다. 그러나 한 번에 소량의 파일을 이동하는 데 문제가 없습니다.

var lvi = (ListView.SelectedListViewItemCollection)e.Data.GetData("System.Windows.Forms.ListView+SelectedListViewItemCollection"); 

foreach(ListViewItem item in lvi) 
{ 
var originPathObj = item.Tag; 
var originPathFileType = item.SubItems[1].Text; 

if(originPathFileType == "File") 
{ 
    var originDirInfo = (FileInfo)originPathObj; 

    string originPath = originDirInfo.FullName; 
    string originFileName = originDirInfo.Name; 

    var destinationDirInfo = (DirectoryInfo)dn.Tag; 
    string destinationPath = destinationDirInfo.FullName; 
    string destinationPathWithFile = destinationPath + "\\" + originFileName; 

     if (File.Exists(originPath) && Directory.Exists(destinationPath)) 
     { 
      FileSystem.MoveFile(originPath, destinationPathWithFile, UIOption.AllDialogs); 
     } 
} 
} 

는 사람이 어떻게 성공적으로 파일을 이동할 수있는 더 좋은 방법을 알고 있나요 : 그것은 선택한 목록 항목을 통해 루프하고 이동 위치를 여기

내 코드의 조각인가? 나는 온라인에서 검색을했고, 내가 찾은 것은 모두 내가 이미 완료 한 것을 제안하는 사람들이었는데, 이것은 foreach 루프의 File.Move 코드이다.

또한 FileSystem.MoveFile(originPath, destinationPathWithFile, UIOption.AllDialogs);은 이미 파일을 이동할 때 진행률 표시 줄이있는 대화 상자를 제공합니다. 그러나 소량의 파일을 이동할 때 결과는 즉시 나타나며 Windows 탐색기에서 1000 개의 파일을 이동할 때 잠시 동안 진행률 표시 줄이 나타납니다. 이는 내 응용 프로그램에서 달성하기를 원합니다.

답변

0
Task.Run(() => 
{ 
    YourLongRunningFunc(); 
}); 

내 논리를 YourLongRunningFunc()에 게시하십시오. 이렇게하면 UI가 반응하고 고정 된 UI가 눈에 띄지 않게됩니다.

+0

이후로 원래의 게시물에서 foreach 루프의 논리를 작업으로 옮겨서 동시에 시작했습니다. 좋은 소식은 이제 진행 막대가 나타나고 파일이 전송된다는 것을 알고 있지만 나쁜 소식은 많은 실행 작업이 만들어지기 때문에 대화 상자에 실제로 "X에서 Y로 한 항목 이동"이라는 많은 진행 표시 줄이 있다는 것입니다. 어쨌든 내가 파일 탐색기처럼 하나의 진행률 막대로 결합하기 전에 내가 움직이고있는 모든 파일을 통합 할 수 있습니까? 진행 막대를 "X에서 Y로 700 항목 이동"과 같이 표시하고 싶습니다. –

+0

직접 할 수 있고 자신의 진행률 막대를 만들 수 있습니다. 복잡성의 문제 일뿐입니다. – David

관련 문제