첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형
728x170
using System.IO;
using System.Threading;
using System.Threading.Tasks;

#region 디렉토리 크기 구하기 (비동기) - GetDirectorySizeAsync(directoryPath)

/// <summary>
/// 디렉토리 크기 구하기 (비동기)
/// </summary>
/// <param name="directoryPath">디렉토리 경로</param>
/// <returns>디렉토리 크기</returns>
public Task<long> GetDirectorySizeAsync(string directoryPath)
{
    if(!Directory.Exists(directoryPath))
    {
        return Task.FromException<long>(new DirectoryNotFoundException("디렉토리가 없습니다."));
    }
    else
    {
        string[] filePathArray = Directory.GetFiles(directoryPath, "*.*", SearchOption.AllDirectories);

        if(filePathArray.Length == 0)
        {
            return Task.FromResult(0L);
        }
        else
        {
            return Task.Run
            (
                () =>
                {
                    long totalFileLength = 0;
            
                    Parallel.ForEach
                    (
                        filePathArray,
                        (filePath) =>
                        {
                            FileStream fileStream = new FileStream
                            (
                                filePath,
                                FileMode.Open,
                                FileAccess.Read,
                                FileShare.ReadWrite,
                                256,
                                true
                            );

                            long fileLength = fileStream.Length;

                            Interlocked.Add(ref totalFileLength, fileLength);
            
                            fileStream.Close();
                        }
                    );
            
                    return totalFileLength;
                }
            );
        }
    }
}

#endregion
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요