#!/usr/bin/ruby

# 파일과 디렉토리

## File

file = File.new('sample.txt', File::RDWR | File::CREAT, 0644) # 읽기및쓰기 모드로 파일이없으면 생성하고, 퍼미션은 644.
file.write("Hello, there!")
file.close # 열었으면 닫아야죠

File.open('sample.txt', 'r'){|file|
  p file.readline
}

File.write('sample2.txt', "Hahaha") # 이렇게도 쓰는 것도 가능합니다.


### 클래스 메서드
=begin

* link : 하드 링크를 생성합니다.
* symlink
* mkfifo

* absolute_path?
* absolute_path
* base_name
* dir_name
* expand_path
* ext_name
* fn_match?
* join
* path
* readlink
* realdirpath
* realpath
* split


* atime
* birthtime
* ctime
* mtime


* blockdev?
* chardev?
* directory?
* executable?
* executable_real?
* exist?
* file?
* ftype
* grpowned?
* identical?
* lstat
* owned?
* pipe?
* readable?
* readable_real?
*setgid?
* setuid?
* socket?
* stat
* sticky?
* symlink?
* umask
* world_readable?
* worls_writable?
* writable?
* writable_real?

* empty?
* size

* chmod
* chown
* lchmod
* lchown
* utime
* lutime
* rename
* flock

* truncate
* unlink

=end

### 인스턴스 메서드
=begin

* path

* atime
* birthtime
* ctime
* mtime

* lstat

* size

* truncate

=end



## Dir

dir = Dir.new('.')
p dir.read
p dir.read
dir.close

### 클래스 메서드

=begin
* chdir
* chroot
* children
* empty?
* entries
* exist?
* getwd : 'pwd'
* glob : 패턴에 일치하는 파일 패스를 배열로 반환
* home : 사용자 홈 디렉토리

* each_child : '.'과 '..'는 포함되지 않는다.
* for_each : '.'과 '..'도 포함

* mkdir
* open
* unlink / delete / rmdir

=end

### 인스턴스 메서드
=begin
* read
* close
* rewind
* seek
* pos

* children
* fileno : 정수 형태의 파일 디스크립터를 반환
* path
* tell

* each
* each_child

=end




## 임시 디렉토리

require 'tmpdir'

Dir.tmpdir #
Dir.mktmpdir{|dir|
  puts "Location is #{Dir.tmpdir}/d"
}

## 임시 파일

require 'tempfile'

file = Tempfile.new('foo')
begin
  # ...
ensure
  file.close
  file.unlink
end

Tempfile.create('foo') {|file|
  # ...
}



## File Utils

FileUtils.pwd

=begin
* mkdir
* mkdirs
* link_entry
* link / ln
* symlink / ln_s

* remove_dir
* remove_entry
* remove_file
* remove / rm
* safe_unlink / rm_f
* rm_r
* rm_rf / rmtree
* rmdir

* pwd
* uptodate?

* chdir / ch
* chown
* chmod
* touch


* compare_file
* compare_stream

* copy_entry
* copy_file
* copy_stream
* copy / cp
* cp_r
* cp_rl
* install
* move / mv


=end


## Find

require 'find' # 주어진 디렉토리 및 자식 디렉토리를 탐색한다.

Find.find("#{ENV['HOME']}/Workspace") {|path|
  if (File.directory?(path))
    if File.basename(path).start_with?('.')
      Find.prune # 더 깊이 들어가지 않는다.
    else
      next
    end
  else
    puts path
  end
}



END{

  # https://ruby-doc.org/3.3.0/File.html
  # https://ruby-doc.org/3.3.0/FileTest.html
  # https://ruby-doc.org/3.3.0/Dir.html

  # https://ruby-doc.org/3.3.0/stdlibs/tmpdir/Dir.html
  # https://ruby-doc.org/3.3.0/stdlibs/tempfile/Tempfile.html

  # https://ruby-doc.org/3.3.0/stdlibs/fileutils/FileUtils.html
  # https://ruby-doc.org/3.3.0/stdlibs/find/Find.html


}
