2013-12-23 2 views
0

Windows 7에서 루비 스크립트를 실행해야합니다. (나쁘지 않은 생각입니다.) 내 스크립트는 폴더를 만들고 (없는 경우) 폴더에 파일을 복사합니다. 내가 좋아하는,이 작업을 수행 할 수 Fileutils의 lib 디렉토리를 사용하고 있습니다 : 우분투에Windows 7에서 루비 스크립트를 실행해야하고 권한이 거부되었습니다. EACCES

FileUtils.mkdir_p(path) 
FileUtils.cp_r(file.path, path) 
FileUtils.touch(file) 

와 맥 모두 괜찮습니다,하지만 윈도우 7 시스템에서 나는 다음 오류가있어이 코드 라인에

Permission denied - ./program_folder/input/. (Errno::EACCES) 

를 :

Dir.entries('./program_folder/input').map { |file_name| File.new("./program_folder/input/#{file_name}") }.compact 

어떤 아이디어로 해결할 수 있습니까?

나는 ... 관리자 권한으로 루비와 IRB termianl를 실행하려고하고 모든 경로하지만 여전히 변화에 FileUtils.chmod_R (0777, @Path을) 할 시도

답변

1

당신의 명령

Dir.entries('./program_folder/input').map { |file_name| 
    File.new("./program_folder/input/#{file_name}") 
}.compact 

은 이전에 읽은 파일/폴더와 같은 이름으로 파일을 만들려고합니다. 구체적

:

  1. Dir.entries('.') 구해진 제 파일 실제 디렉토리 (.)이다.
  2. "./program_folder/input/#{file_name}"./program_folder/input/. (기존 디렉토리)입니다.
  3. 이 디렉터리 경로는 새 파일의 경로 여야합니다.
  4. File.new을 사용하면 디렉토리를 파일로 열 수 없습니다. 코멘트 후

비고 : 내부

Dir.entries 당신이 File.new 전화 - 파일 핸들을 만듭니다. 모드가 없으면 기존 파일 (파일이 아니라 디렉토리!)을 열려고 시도합니다. .은 파일로 보류 할 수없는 디렉토리입니다.

파일 이름 만 필요하면 File.new이 필요하지 않으며 "./program_folder/input/#{file_name}" 문자열이면 충분합니다.

File.join("./program_folder/input", file_name) 

또는 실제 파일 이름을해야하는 경우 디렉토리를 확인할 수 있습니다

File.join(".", "program_folder", "input", file_name) 

:

Dir.entries('./program_folder/input').map { |file_name| 
    "./program_folder/input/#{file_name}" unless File.directory?("./program_folder/input/#{file_name}") 
}.compact 

이상, 제거 더 나은 솔루션은 File.join 방법이 될 것입니다 디렉토리 :

Dir.entries('.').delete_if{|file_name| 
    File.directory?(file_name) 
} 
+0

파일을 덮어 쓰는 것이 아니라,이 디렉터리의 모든 파일 개체를 사용하여 배열을 만듭니다. "File.new 지정된 모드에 따라 filename으로 명명 된 파일을 열고 새 File 객체를 반환합니다." – Extazystas

+0

편집을 참조하십시오. 나는 지금 당신이 달성하기를 원하는 것을 이해합니다. – knut

+0

나는 이해합니다. '을 (를) 삭제했습니다.' File.New ("./ program_folder/input/# {file_name}") file_name = ~이 아닌 경우 .dir.entries ('./ program_folder/input'). /^\.\.?$/} 을 .compact 그리고 지금이 코드에 거부 'utime와의 허락에 Fileutils의 또 다른 오류가 있습니다! FileUtils.touch (파일) 그래서, 감사합니다 – Extazystas

관련 문제