본문 바로가기
ios 뽀개기/objective-c

날짜를 이용해서 파일 삭제하기

by 인생여희 2019. 4. 3.
반응형

날짜를 이용해서 파일 삭제하기

날짜를 이용해서 30일이 지난 폴더 또는 파일을 삭제하는 기능을 구현해 보자. 

먼저, 다큐먼트 폴더 안에 video, photo, audio 폴더가 각각있다고 가정하자. 위의 미디어 폴더 아래는 20190401, 20190402 와 같이 폴더 or 파일이름이 생성한 날짜인 파일들이 존재할 것이다.

참고로 다큐먼트 폴더는 사용자가 접근할 수 있는 최상위 폴더이다. 다큐먼트 이외의 폴더로는 애플 정책상(보안문제)접근이 어렵다.

필요한 데이터는 아래와 같다.

1.오늘날짜를 초를 변환한 값.

2.파일을 생성한 날짜를 초로 변환한 값

3.생성한 날짜에 30일(초값)을 더한 값. - 삭제예정일 (생성한 날짜를 초로 변환하고 30일을 초로 변환해서 계산 후 리턴 한다.)

위의 데이터를 구했으면 날짜값을 비교해서 파일을 삭제해준다. 

* 앱을 구동할때 날자를 계산해서 처리(AppDelegate.m)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    NSLog(@"application - 앱실행!");
    
    //일정 시간 지난 미디어 파일 지우기
    [self deleteOverDateMediaFile];
    
    return YES;
}

//일정 시간 지난 미디어 파일 지우기
-(void)deleteOverDateMediaFile{
    
    NSLog(@"일정 시간 지난 미디어 파일 지우기 deleteOverDateMediaFile - appDelegate");
    float todaySeconds = [self getTodaySeconds];
    // video 폴더 안의 파일 확인 후 삭제,  audio 폴더 안의 파일 확인 후 삭제,  photo 폴더 안의 파일 확인 후 삭제,
    [self startDeleteMediaFile:@"/video" deleteStandardSeconds:todaySeconds ];
    [self startDeleteMediaFile:@"/audio" deleteStandardSeconds:todaySeconds ];
    [self startDeleteMediaFile:@"/photo" deleteStandardSeconds:todaySeconds ];
}

//비디오, 오디오, 사진 파일 삭제 :(오늘날짜를 초로변환 한 값을 전달해준다!)
-(void) startDeleteMediaFile :(NSString *) fileName  deleteStandardSeconds:(float) todaySeconds{
    NSLog(@"비디오, 오디오, 사진 파일 삭제 startDeleteMediaFile - appDelegate");
    //파일 매니져
    NSFileManager *fm = [NSFileManager defaultManager];
    //최종 문서  폴더
    NSArray *DocumentDrectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    //다큐먼트 폴더에서 제일 상위 폴더(video, audio, photo) 바로 아래 존재하는 폴더들(20190101, 20190202....)
    NSString *bigDir = [DocumentDrectory[0] stringByAppendingFormat:@"%@",fileName];
    
    //디렉토리 존재여부 확인
    if ([fm isWritableFileAtPath:bigDir] ) {
        NSLog(@" %@ Dir가 존재합니다." , bigDir);
    }else{
        NSLog(@" %@ Dir가 존재하지 않습니다. ㅜnㅜ 확인해주세요..." ,bigDir);
    }
    
    //폴더 안에 있는 날짜 폴더들을 배열에 담는다.
    NSError *err;
    NSArray *smallDateFileArray = [fm contentsOfDirectoryAtPath:bigDir error:&err];
    //해당 경로가 존재하면
    if (err == nil) {
        //날짜 폴더 개수별로 꺼내기
        for (int i = 0 ; i < (unsigned long)[smallDateFileArray count]; i++) {
            
            //삭제할 폴더의 전체 경로 - 아래쪽에서 삭제해줄때 사용됨.
            NSString *folderPathToDelete = [bigDir stringByAppendingFormat:@"/%@/",[smallDateFileArray objectAtIndex:i] ];
            
            //String 폴더명 가져와서 날짜 타입으로 바꾸고 초로 바꿔주기
            NSString *dateFileNameString =   [smallDateFileArray objectAtIndex:i];  //폴더의이름(가공전)
            NSDateFormatter *fileDateFormatter = [[NSDateFormatter alloc] init];   //날짜포멧
            [fileDateFormatter setDateFormat:@"yyyyMMdd"];                                  //날짜포멧
            NSDate *fileNameDate = [fileDateFormatter dateFromString:dateFileNameString];   //폴더이름 가공(NSDate)
            NSString *fileNameDateString = [fileDateFormatter stringFromDate:fileNameDate]; //폴더이름 가공(NSString)
            NSLog(@"파일이름(날짜) : %@" , fileNameDateString);
            NSTimeInterval fileNameToSeconds = [fileNameDate timeIntervalSinceReferenceDate];//초로변환
            NSLog(@"파일이름(초) : %f" , fileNameToSeconds);  //57 5737200  4월 1일(촬영일)
            
                                                                                                //57 6000000  4월 2일(오늘)
            
            
            //위의 폴더의 초에서 30일에 해당하는 초값을 계산해서 리턴
            float afterLongDaySec = [self delDateString:fileNameDateString];
            NSLog(@"afterLongDaySec(30일 이후 날짜) 초 : %f" , afterLongDaySec);
            //57 8329216  4월 40일(삭제기준일)
            
            
            // 오늘날짜초 >= 삭제예정날짜초
            // 오늘날짜와 비교해서 해당폴더의 30일 이후의 날짜값이 오늘날짜값 보다 작으면 .
            if (todaySeconds >= afterLongDaySec) {
                
                NSError *deleteErr;
                //해당 폴더 삭제!!
                [[NSFileManager defaultManager] removeItemAtPath:folderPathToDelete error:&deleteErr];
                
                if (deleteErr != nil) {
                    NSLog(@"이전 파일 삭제 중 오류가 발생했습니다.");
                    return;
                }else{
                    NSLog(@"삭제 성공!");
                    NSLog(@"%@ 폴더는 특정시간이 지난 파일이기 때문에 삭제 했습니다." , dateFileNameString);
                    NSLog(@"삭제 경로 : %@ " , folderPathToDelete);
                }
            }
        } // for - end
    }    // if - end
}


//해당 날짜에  30일(초값)을 더해서  초값으로 리턴
- (float) delDateString:(NSString *)date{
    int milsec = 3600 * 24 * 30;                    //30일
    //String 폴더명 가져와서 날짜 타입으로 바꾸고 숫자로 바꿔주기
    NSDateFormatter *fileDateFormatter = [[NSDateFormatter alloc] init];
    [fileDateFormatter setDateFormat:@"yyyyMMdd"];
    NSDate *fileNameDate = [fileDateFormatter dateFromString:date];
    
    //30일 이후의 날짜
    NSDate *delDate = [fileNameDate dateByAddingTimeInterval:milsec];
    
    //날짜 포멧형식으로 변경
    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    [formatter setDateFormat:@"yyyyMMdd"];
    NSString *delDateString = [formatter stringFromDate:delDate];
    NSLog(@"파일의 30일 이후 날짜 : %@" , delDateString);
    NSDate *dateDate = [formatter dateFromString:delDateString];
    NSTimeInterval seconds = [dateDate timeIntervalSinceReferenceDate];
    NSLog(@"파일의 30일 이후 날짜 초 : %f" , seconds);
    return seconds;
}

//오늘 날짜 초값으로 리턴
-(float)getTodaySeconds{
    //오늘 날짜
    NSDate *today = [NSDate date];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"yyyyMMdd";
    NSString *dateString = [dateFormatter stringFromDate:today];
    NSLog(@"오늘 날짜 : %@" , dateString);
    NSDate *dateDate = [dateFormatter dateFromString:dateString];
    NSTimeInterval seconds = [dateDate timeIntervalSinceReferenceDate];
    NSLog(@"오늘 날짜 초로 변환 : %f" , seconds);
    return seconds;
}

 

*파일

DeleteFileFromDate.zip
/ 0.06MB

반응형

댓글