Fly to the sky & Return

[swift]  사진 폴더에 들어있는 사진들을 찍은 날짜별 폴더로 이동하여 정리시키는 코드 본문

프로그래밍/Swift(IOS & Mac)

[swift]  사진 폴더에 들어있는 사진들을 찍은 날짜별 폴더로 이동하여 정리시키는 코드

낼은어떻게 2016. 3. 18. 10:42
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

그디여 해당 프로그램을 만들기 위한 소스들이 다 모였습니다.

필요한 소스들을 나열해보면

1. 사진폴더를 선택하는 소스

2. 선택된 폴더에서 특정 확장자만 선택하는 소스(jpg)

3. 선택된 파일에서 EXIF data 중 날짜 데이터만 추울하는 소스

4. 날짜데이터를 이용해서 폴더를 생성하는 함수

5. 생성된 폴더로 해당파일을 이동하는 함수


이렇게 다섯가지의 소스들 한데 모와서  클릭한번으로 사진들을 정리해주는 프로그램을 만들어보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import Cocoa
 
class ViewController: NSViewController {
 
   
    @IBAction func select_folder(sender: AnyObject) {
        //폴더 선택하는 코드
        var myOpenDialog: NSOpenPanel = NSOpenPanel()
        myOpenDialog.canChooseDirectories = true
        myOpenDialog.runModal()
        
        var path = myOpenDialog.URL?.path
        var fs: NSFileManager = NSFileManager.defaultManager()
        
        if (path != nil) {
            
            var err = NSError?()
            let contents: Array = try! fs.contentsOfDirectoryAtPath(path!)
            
            if !(err != nil) {
                for f in contents {
                    //확장자를 분리하는 코드
                    let strSplit = f.characters.split(".")
                    //String(strSplit.first!)  <- 파일명 부분
                    var k = String(strSplit.last!)   //<- 확장자부분을 문자열로 지정
                    if k == "jpg" {
                        
                        //문자열을 NSURL로 변경
                        let fileUrl = NSURL(string: "file://" + path! + "/" + f)  // <- path로 넘어온 파일경로는 /Users 로 시작하는 경로인지라 앞에 file:// 추가해서 밑에 함수가 해석가능한 경로로 변경
                        
                        let imageSource = CGImageSourceCreateWithURL(fileUrl!, nil)
                        
                        let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource!0, nil)! as NSDictionary;
                        
                        let exifDict = imageProperties.valueForKey("{Exif}")  as! NSDictionary;
                        let dateTimeOriginal = exifDict.valueForKey("DateTimeOriginal"as! String;
                        
//EXIF 문자열 정보를 분리하는 코드
                        let fullNameArr = dateTimeOriginal.characters.split{$0 == ":" || $0 == " "}.map(String.init)
                        
                        //exif 정보를  yyyy_mm_dd 로 변경
                        var direct_name = fullNameArr[0+ "_" + fullNameArr[1+ "_" + fullNameArr[2]
                        
                        var path1 = String(path!+ "/" + direct_name   //<-  dialog로 선택된 폴더하위에 생성할 폴더이름을 지정
                        
//폴더 생성 코드
                        let fileManager = NSFileManager.defaultManager()
                        do
                        {
                            //withIntermediateDirectories: false   <-이면 중복된 폴더가 있을때 에러발생
                            try fileManager.createDirectoryAtPath(path1, withIntermediateDirectories: true, attributes: nil)
                            
                        }
                        catch let error as NSError
                        {
                            print("Error while creating a folder.")
                        }
                        
// 파일이동 코드
                        //Users로 시작하는 경로이며..   경로에 파일이름이 들어가야함..  
                        if ((try? fileManager.moveItemAtPath(String(path! + "/" + f), toPath: path1 + "/" + f)) != nil) {
                            print("Move successful")
                        } else {
                            print("Moved failed:)")
                        }
                    }
                    
                }
            }
        }
    
    }
 
}
 
 
 
 
cs


완성된 전체코드입니다......          이 코드가지고  약 천개정도의 사진을 돌려봤는데 중간중간 에러가 나긴 하네영...


사진을 다른 폴더로 옮기고 실행하면 잘 되는 것봐서는..... 머 메모리관련 에러일수도 있을듯한긴한뎅

하여튼 적은 숫자의 사진은 잘 되는 것을 확인했습니다...   이것저것 같다붙인 코드인지라 지저분하네영. ㅋ


하여튼 파이썬보다는 좀더 길어지고 복잡한 코드임에는 틀림이 없어보이긴 하지만.. 제가 첨으로 에디트한 코드인지라..   많은 애착이 갈듯합니당. ^^