[swift] 파일 이동 및 복사 시 진행률 표시

파일을 이동하거나 복사하는 경우 대용량 파일이라면 시간이 걸릴 수 있습니다. 사용자에게 파일 이동이나 복사가 진행 중임을 알려주는 것은 좋은 사용자 경험을 제공합니다. 이번 블로그에서는 Swift에서 파일 이동 및 복사 시 진행률을 표시하는 방법에 대해 알아보겠습니다.

기능 개요

파일 이동이나 복사 작업을 수행할 때 사용자에게 작업이 진행 중임을 알려주기 위해 진행률을 표시하는 것이 좋습니다. FileManager 클래스를 사용하여 파일을 이동하거나 복사할 때 해당 작업에 대한 진행률을 측정하고 사용자에게 시각적으로 표시할 수 있습니다.

진행률 표시 방법

FileManager 클래스의 copyItem(at:to:)moveItem(at:to:) 메서드를 사용하여 파일 이동이나 복사 작업을 수행할 때, 해당 메서드가 실제로 작업을 수행하는 동안 파일의 크기와 실제로 복사되거나 이동된 크기를 비교하여 진행률을 계산할 수 있습니다.

아래는 파일 복사 시 진행률을 표시하는 Swift 코드의 예시입니다.

import Foundation

func copyFileWithProgress(from sourceURL: URL, to destinationURL: URL, progressHandler: @escaping (Float) -> Void, completion: @escaping (Error?) -> Void) {
    let fileSize: UInt64
    do {
        // 복사할 파일의 크기를 가져옴
        let attr = try FileManager.default.attributesOfItem(atPath: sourceURL.path)
        fileSize = attr[.size] as! UInt64
    } catch {
        completion(error)
        return
    }

    do {
        // 파일 복사 작업 수행
        let input = try FileHandle(forReadingFrom: sourceURL)
        defer {
            input.closeFile()
        }
        let output = FileHandle(forWritingAtPath: destinationURL.path)
        defer {
            output?.closeFile()
        }

        var totalBytesWritten: UInt64 = 0
        while true {
            let buffer = input.readData(ofLength: 4096)
            if buffer.count == 0 {
                // 파일 복사 작업 완료
                completion(nil)
                break
            }
            output?.write(buffer)
            totalBytesWritten += UInt64(buffer.count)

            // 진행률 업데이트
            let progress = Float(totalBytesWritten) / Float(fileSize)
            progressHandler(progress)
        }
    } catch {
        completion(error)
    }
}

// 사용 예시
let sourceURL = URL(fileURLWithPath: "path_to_source_file")
let destinationURL = URL(fileURLWithPath: "path_to_destination_file")

copyFileWithProgress(from: sourceURL, to: destinationURL,
                    progressHandler: { progress in
                        // 진행률 업데이트를 통해 UI 업데이트
                        print("Progress: \(progress * 100)%")
                    },
                    completion: { error in
                        if let error = error {
                            // 복사 실패
                            print("Error: \(error)")
                        } else {
                            // 복사 성공
                            print("Copy completed")
                        }
                    })

위 예시 코드는 파일을 복사하면서 복사 진행률을 업데이트하는 방법을 보여줍니다. copyFileWithProgress 함수는 파일 복사 작업을 수행하면서 진행률을 업데이트하고, 완료 시에는 콜백을 호출하여 사용자에게 알리는 기능을 수행합니다.

이를 통해 Swift로 파일 이동이나 복사 시 진행률을 표시할 수 있으며, 사용자에게 작업이 진행 중임을 시각적으로 알리는 데 도움이 될 것입니다.

결론

이번 글에서는 Swift에서 파일 이동 및 복사 시 진행률을 표시하는 방법에 대해 알아보았습니다. 파일 작업 중에는 사용자에게 진행 상황을 알려주는 것이 중요하며, 이를 위해 위와 같이 진행률 표시를 구현할 수 있습니다. 사용자 경험을 향상시키기 위해 파일 작업 시 진행률을 적절히 표시하는 것이 좋습니다.

참고 자료