int readedSize = sourceFileStream.Read(buffer, 0, buffer.Length);
이 코드에서 readedSize(readSize) 는 파일 스트림으로 부터 받아온 크기를 반환합니다. 따라서 1024일 수도 있고, 이보다 작을 수도 있습니다. 이렇게 읽어진 값을 대상 파일 스트림에 써줍니다. 단, 받아온 사이즈가 0보다 작은 경우 파일의 끝 지점에 도착한 것이기 때문에, break를 통해 작업을 중지합니다.
참고 읽어진 사이즈는 문법 상 readSize가 맞지만 (read-read 과거) 습관으로 readedSize라고 하는 점 양해 바랍니다.
그리고 모든 작업이 완료되면 Close()를 통해 flush 처리 및 스트림을 마무리 짓습니다.
진행 퍼센트 가져오기
파일 복사는 모두 구현했기 때문에 이제 이 중간에 퍼센트를 가져오면 됩니다. 퍼센트는 조각을 기준으로 가져오기 때문에 조각이 매우크면, 한 조각을 읽어오는 데 시간이 걸릴 수 있습니다. 따라서 보통 102400~512000 사이즈를 권장합니다.
long maxSize = sourceFileStream.Length;
long totalWroteSize = 0;
로 초기 값을 지정 해 줍니다. maxSize는 복사하고자 하는 파일의 전체 길이를 가져오고, totalWroteSize 는 한 조각이 써질 때 마다 증가될 조각 크기입니다.
다음으로 while 내에는 다음과 같은 소스코드를 작성 해 넣습니다.totalWroteSize += readedSize;
Console.WriteLine(totalWroteSize + "/" + maxSize);
결과적으로 maxSize 변수에는 복사하고자 하는 파일의 전체 길이가, totalWroteSize에는 현재 작업까지 써진 파일의 총 길이가 됩니다. 이를 임시적으로 Console.WriteLine을 통해 콘솔창에 출력 해 봅니다. 이러한 작업을 통해 퍼센트로 구할 수 있습니다.
double percent = ((double)totalWroteSize / (double)maxSize)*100;
이렇게 구한 값은 ProgressBar 등에 적용하여 사용할 수 있습니다. 여기서 주의 할 점은 각 양 변수를 double로 처리하여 처리 결과도 double로 나올 수 있도록 합니다. 파일의 용량은 4GB를 넘을 수 있기 때문에, long으로 선언되어 있는데, long으로 나눗셈을 하는 경우 소수점은 모두 제거되기 때문에 100% 일 때만 1이 되고 나머지의 경우 모두 0으로 처리되는 문제가 발생할 수 있습니다.