파일 디렉토리 조작

성혜·2024년 1월 18일
0

Java

목록 보기
21/25
post-thumbnail

파일 디렉토리 조작

윈도우 탐색기로 하는 행동을 자바로 구현!


외부파일 접근하는 방법

  1. 외부 파일을 참조하는 객체를 생성 > 중개인 , 대리인 역할
  2. 참조 객체 조작 > 실제 파일에 적용

  • 예시 코드 (파일 조작)
//파일 경로
String path = "C:\\class\\code\\java\\file\\data.txt";

//파일 참조 객체 > java.io.File 클래스
File file = new File(path);

//꼭 파일 유무 확인하면서 파일 조작 해야함!!
if(file.exists()) {
			
//파일 조작 > 많은 기능이 다양하게 존재!
			
System.out.println(file.getName()); //data.txt (파일명)
System.out.println(file.isFile()); //true (파일 or 폴더)
System.out.println(file.isDirectory()); //false (파일 or 폴더)
System.out.println(file.length()); //16 > 파일크기(byte)
System.out.println(file.getAbsolutePath());//실제 파일 경로
			
			
System.out.println(file.lastModified()); // 1705547421511 > 누적값(epoch time) > 마지막 수정날짜
Calendar c1 =Calendar.getInstance();
System.out.println(c1.getTimeInMillis());
c1.setTimeInMillis(file.lastModified());
System.out.printf("%tF %tT\n" ,c1, c1);

System.out.println(file.isHidden()); //숨김 파일인지
System.out.println(file.canRead()); //읽기 가능
System.out.println(file.canWrite()); //수정 가능
System.out.println(file.getParent()); //관리하고 있는 폴더의 위치

			
}else {
System.out.println("해당 경로에 파일이 없습니다.");
}


  • 예시 코드 (폴더 조작)
    : 폴더 == 파일의 일종
    쉽게 생각하면 파일 밑에 작게 폴더명 적는 공간이 있다!!
    그래서 파일 이동은 파일 밑에 폴더 이름을 바꾼다고 생각하자!
//폴더 경로
String path = "C:\\class\\code\\java\\file";

//폴더 참조 객체
//폴더가 파일의 일종이라 파일과 같은 클래스를 사용
		
File dir = new File(path);
		
if(dir.exists()) {
			
System.out.println(dir.getName()); 
System.out.println(dir.isFile()); 
System.out.println(dir.isDirectory()); 
System.out.println(dir.length()); //0 => 안에 내용물의 크기.
System.out.println(dir.getAbsolutePath());
System.out.println(dir.isHidden());
System.out.println(dir.canRead()); 
System.out.println(dir.canWrite()); 
System.out.println(dir.getParent()); 
			
			
			
}else {
System.out.println("폴더가 존재하지 않습니다.");
}



createNewFile()

  • 파일 조작 > 생성

//생성
String path =  "C:\\class\\code\\java\\file\\score.txt";
		
File file = new File(path);
		
try {

//동일한 파일이 있으면 동작 안함 (false)
boolean result = file.createNewFile();
System.out.println(result);
			
			
} catch (IOException e) {
	e.printStackTrace();
}


renameTO

  • 파일 조작 > 수정

: 원래 있는 파일과 바꿀 파일 경로를 만든 다음

//파일명 수정
//- score.txt > jumsu.txt
		
String path =  "C:\\class\\code\\java\\file\\score.txt";
File file = new File(path);
		
String path2 =  "C:\\class\\code\\java\\file\\jumsu.txt";
File file2 = new File(path2);
		
//"C:\\class\\code\\java\\file\\score.txt" => "C:\\class\\code\\java\\file\\score.txt"
boolean result = file.renameTo(file2);
System.out.println(result);

  • 폴더 이동과 파일 이름 바꾸기
    : 앞서 말한거 처럼 폴더 이동은 파일 이름 바꾸는 것

//이동

String path =  "C:\\class\\code\\java\\file\\score.txt";
File file = new File(path);
		
//파일 이름도 바꾸고 폴더도 이동함 !!
String path2 =  "C:\\class\\code\\java\\move\\jumsu.txt";
File file2 = new File(path2);
		
boolean result = file.renameTo(file2);
System.out.println(result);


delete()

  • 삭제

❗ 주의 할 점 ❗
: 폴더를 삭제할 때 폴더 안에 파일이 있으면 삭제 안됨 !
=> 파일을 지우고 폴더를 삭제 해야 함!

: delete()는 진짜 삭제라 신중하게!!

//삭제
String path =  "C:\\class\\code\\java\\file\\score.txt";
File file = new File(path);
		
if(file.exists()) {
			
	//보통 삭제 : 휴지통 폴더로 이동하기
	//진짜 삭제 : 복구 불가능
	boolean result = file.delete(); //휴지통에도 없어! 진짜 지워짐
	System.out.println(result);
			
}


mkdirs()

  • 폴더 생성

: 최종 폴더까지 중간에 낀 폴더가 없으면
=> mkdir

: 여러 폴더를 거쳐서 가야한다면
=> mrdirs

String path =  "C:\\class\\code\\java\\file\\bbb\\ccc\\ddd";
File dir = new File(path);
		
if(!dir.exists()) {
			
	//폴더가 없음
	//중간에 없는 폴더까지 포함해 최종 ddd 폴더까지 만들기
	boolean result = dir.mkdirs();// make directorys

	System.out.println(result);
			
	else {
	System.out.println("같은 이름의 폴더가 존재함.");
	}


  • 응용 코드

: 회원별 개인 폴더 만들기

//요구사항] 회원 > 회원명으로 개인 폴더 생성
		
String[] member = {"홍길동","아무개","강아지","고양이","독수리"};
		 
for(int i=0; i<member.length;i++) {
	
    //path의 경로를 원하는 형식으로 지정
	String path = String.format("C:\\class\\code\\java\\file\\회원\\[개인폴더]%s님",member[i]);
			
	File dir = new File(path);
			
	System.out.println(dir.mkdirs());


  • 응용코드 2
    : 특정 폴더의 내용물 보기 (자주 사용!!)

❗ 주의 할 점 ❗

널 체크 필요
: 디렉터리 안에 파일이 없거나 디렉터리 자체가 존재하지 않을 수 있습니다. 따라서 listFiles() 메서드로 얻은 배열은 null일 수 있으므로, 반드시 널 체크를 해주어야 합니다.

디렉터리와 파일 구분
: listFiles() 메서드는 디렉터리 안의 모든 파일과 디렉터리를 포함한 배열을 반환합니다. 따라서 반복문 내에서 각 요소가 파일인지 디렉터리인지 확인하는 로직이 필요합니다.


String path = "C:\\class\\dev\\eclipse";

File dir = new File(path);


//경로안 모든 파일들을 반환 
//주의 사항 확인하기
File[] list = dir.listFiles(); 

if(dir.exists()) {
			
//대상 홀더의 내용물 > 목록(배열)으로 가져오기 
//String[] list = dir.list();
//			
//for(String item : list) {
//	System.out.println(item); //자식의 이름만 반환
//	}
			
//객체로 돌려줌 
File[] list = dir.listFiles(); 

for (File item : list) {

	if (item.isDirectory()) {
		System.out.printf("[%s]\n", item.getName());
		}

	}
		
for (File item : list) {

	if (item.isFile()) {
		System.out.println(item.getName());
			}
		}

	}
    
//결과
[configuration]
[dropins]
[features]
[p2]
[plugins]
[readme]
.eclipseproduct
artifacts.xml
eclipse.exe
eclipse.ini
eclipsec.exe


연습용으로 좋음!! 확실하게 하고 넘어가기

  • 폴더 정보 (재귀 구조 사용)
//폴더 > 정보?
//-717MB (752,028,237 바이트)
//-파일 13,052, 폴더 2,488
//-재귀 구조

String path = "C:\\class\\code\\java\\file";
		
File dir = new File(path);
		
if(dir.exists()) {
			
	count(dir);
			
	System.out.printf("총 파일 개수 :%,d개\n",fileCount);
	System.out.printf("총 폴더 개수 :%,d개\n",dirCount);
	System.out.printf("총 폴더 크기 :%,dB\n",dirSize);
			
		}
		
		
		
	}

	private static void count(File dir) {
		//1. 목록 가져오기
		File[] list = dir.listFiles();
		
		//2. 파일 > 개수
		for(File file : list) {
			if(file.isFile()) {
				//파일을 지우는 상황 = 모든 폴더를 찾아 파일을 다 지움
				file.delete();
				
//				fileCount++;
//				dirSize += file.length();
				
			}
		}
		
		//3. 자식 폴더 > 동일한 행동 반복
		for(File subdir : list) {
			if(subdir.isDirectory()) {
				
				dirCount++;
				//1~3번 반복
				
				count(subdir);
				
			}
		}
		
		//빈폴더 => 지울 수 있음
		dir.delete();

profile
하루를 정리하고 기록합니다.

0개의 댓글