Java를 사용하여 출력 디렉토리의 파일 속성을 볼 수 있는 프로그램

17163 단어 흐름 APIJava
작업 디렉터리에 속하는 파일 등 정보를 한눈에 출력하는 업무가 발생했기 때문이다
나는 그 프로그램을 해 보았다.
절차 요건
  • 파일 경로 파일 이름 크기 최종 업데이트 일자 순으로 출력
  • 파일 경로의 시작 부분에는 최상위 디렉토리(./xxxXXX/xxxXXX.txt 형식)가 포함되지 않습니다
  • 파일 정보 확장자 포함
  • byte 단위로 치수 출력
  • 최종 업데이트 날짜와 시간의 형식은'yyyy-mm-ddH:MM:SS'
  • 정보별 공간 분리
  • 개체가 파일이 아닌 디렉토리에 있는 경우 디렉토리의 파일 수
  • 를 내보냅니다.
  • 출력 총 파일 수 총 목록 수 총 파일 수
  • import java.io.File;
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.nio.file.attribute.BasicFileAttributes;
    import java.nio.file.attribute.FileTime;
    import java.time.LocalDateTime;
    import java.time.ZoneId;
    import java.time.format.DateTimeFormatter;
    import java.time.format.FormatStyle;
    import java.util.Date;
    import java.util.Locale;
    import java.util.Scanner;
    import java.util.stream.Stream;
    
    public class Main {
        //
        private static int count = 0;
        private static int fileCount = 0;
        private static int dirCount = 0;
        private static int totalSize = 0;
    
        public static void main(String[] args) throws java.io.IOException{
    
            //コマンドラインで出力対象のトップディレクトリまでの、実行ファイルからの相対パスを記入
            System.out.println("トップディレクトリ名を入力してください");
            @SuppressWarnings("resource")
            Scanner sc1 = new Scanner(System.in);
            String line1 = sc1.nextLine();
    
            Path topDirName = Paths.get(line1);
    
            //トップトップディレクトリ以下の全てのファイル及びディレクトリのパスのストリームを取得
            try(Stream<Path> stream = Files.walk(topDirName)) {
                //トップディレクトの情報は表示しない(スキップする)
                stream.skip(1).forEach(p -> {
    
    
                        try {
                            //ファイル属性を取得
                            BasicFileAttributes attributes = Files.readAttributes(p, BasicFileAttributes.class);
    
                            //一番最初の階層は.\で固定
                            if(p.getNameCount() <= 2){
                                System.out.print("./");
                                //2階層以降
                            }else{
                                //トップディレクトリ名を削除し、パスから最下層のファイル名を除く
                                StringBuilder sb = new StringBuilder();
                                sb.append(p.getParent() + " ");
                                sb.delete(0,sb.toString().indexOf((int)'/'));
                                ////ファイルパスを出力
                                System.out.print("." + sb.toString());
                            }
                            //ファイル名を出力
                            System.out.print(p.getFileName() + " ");
    
                            //対象がディレクトリの場合
                            if (Files.isDirectory(p)){
                                //ディレクトリ数をインクリメント
                                dirCount++;
                                File dir = new File(p.toString());
                                //カウンタをリセット
                                count = 0;
                                count = count(dir.listFiles());
                                //ディレクトリ内のファイル及び、フォルダを出力
                                System.out.print("Dir("+ count + ")" + " ");
                                //対象がディレクトリ出ない場合
                            }else{
                                //ファイルサイズを出力
                                System.out.print(attributes.size()+ " ");
                                //ファイル数をインクリメント
                                fileCount++;
                                //ファイル容量を加算
                                totalSize += attributes.size();
    
                            }
                            //ファイルの最終更日時を出力
                            Date firstDate = new Date();
                            FileTime time = FileTime.fromMillis( firstDate.getTime() );
                            LocalDateTime ldt =  LocalDateTime.ofInstant( time.toInstant(), ZoneId.systemDefault());
                            System.out.println(ldt.format( DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
                                    .withLocale( Locale.JAPANESE ) ) );
    
    
                        } catch (IOException e) {
                            // TODO 自動生成された catch ブロック
                            e.printStackTrace();
                        }
                });
    
                System.out.println("ファイルの数" + " : " + fileCount);
                System.out.println("ディレクトリの数" + " : " + dirCount);
                System.out.println("総容量" + " : " + totalSize);
    
            }catch(IOException e) {
                System.out.println(e);
            }
        }
    
        //ディレクトリの中身のそうファイル数をカウントする(サブディレクトリも再起的にカウント)
        private static int count(File[] list) {
            for (File f : list) {
                if (f.isDirectory()) {
                    count(f.listFiles());
                } else if (f.isFile()) {
                    count++;
                }
            }
            return count;
        }
    }
    
    실행 결과
    ※ Windows는 디렉터리 속성에 기술된 총 크기, 총 파일 수, 총 목록 수와 일치
    Mac면 왜 편차가 생겼는지 모르겠어요.이에 비해 윈도우즈와 맥 디렉터리의 크기는 다르다.
    파일 시스템의 영향일 수도 있고 1KB=1000b일 수도 있습니다.

    좋은 웹페이지 즐겨찾기