생활코딩

Coding Everybody

파일의 제어

토픽 생활코딩 > 서버 > PHP > PHP 기본 수업

파일 다루기

파일복사

/file/7.php

<?php
$file = 'readme.txt';
$newfile = 'example.txt.bak';

if (!copy($file, $newfile)) {
    echo "failed to copy $file...\n";
}
?>

파일삭제

<?php
unlink('deleteme.txt');
?>

읽고 쓰기

 

file_get_contents

1.php

1.php 파일과 같은 디렉토리에 readme.txt 파일이 존재해야 한다.
<?php
$file = './readme.txt';
echo file_get_contents($file);
?>

file_put_contents

2.php

<?php
$file = './writeme.txt';
file_put_contents($file, 'coding everybody');
?>
좀 더 고급스러운 파일 제어를 원한다면 fopen을 참조하자.

네트웍크를 통해서 데이터 읽어오기

<?php
$homepage = file_get_contents('http://php.net/manual/en/function.file-get-contents.php');
echo $homepage;
?>

파일을 다루는 과정에서 발생할 수 있는 문제들

권한

파일을 읽고 쓸 때 권한의 문제로 오류가 발생할 수 있다. 권한에 대한 문제는 다소 복잡하기 때문에 동영상 강의를 참고한다.

아래 코드는 특정 파일이 읽을 수 있는 상태인지를 확인한다.

/file/4.php

<?php
$filename = 'readme.txt';
if (is_readable($filename)) {
    echo 'The file is readable';
} else {
    echo 'The file is not readable';
}
?>

다음 코드는 특정 파일이 쓰기가 가능한지 확인한다.

/file/5.php

<?php
$filename = 'writeme.txt';
if (is_writable($filename)) {
    echo 'The file is writable';
} else {
    echo 'The file is not writable';
}
?>

아래는 파일의 존재 여부를 확인한다.

/file/6.php

<?php
$filename = 'readme.txt';
if (file_exists($filename)) {
    echo "The file $filename exists";
} else {
  	echo "The file $filename is not exists";
}
?>

참고

file_get_contents, file_put_content를 사용할 수 없는 경우라면 fread, fwrite 함수를 사용해야 한다. 자세한 내용은 다음 링크를 참고한다. 

댓글

댓글 본문
  1. hanjaelee
    24.03.04 수강완료
  2. 드림보이
    2022.01.19. 파일 - 파일의 제어 파트 수강완료
  3. ggyuker
    22.01.03 수강완료.. 점점 더 어려워짐
  4. jeisyoon
    2021.07.27 file Control - OK
  5. 김남규
    점점 정말로 ... 어려워지는구만 ㅠㅠ
  6. choon
    감사합니다.
  7. James Parker
    정말 좋네요
  8. 청호
    CentOS 7 사용자입니다.
    파일이나 폴더 권한을 chmod 777로 해줘도 failed to open stream: Permission denied(권한 거부)가 뜬다면 SELinux(보안 강화 리눅스)가 실행되고 있기 때문에 권한 거부가 뜨는 것입니다.
    (터미널에 sestatus를 치면 SELinux가 실행 중이라고 나와요)

    해결 방법 : 터미널에 vim /etc/sysconfig/selinux 치고, SELINUX=enforcing 부분을 SELINUX=disabled로 바꾼 후에 저장하고, 리붓하시면 됩니다. (다만, 이러면 보안상 위험하다고 들은 적 있음)

    자세한건 https://www.lesstif.com......732 참고
  9. 리눅스 초보
    오래된 글이지만.. 추후에 오는 분들을 위해 답변 달자면..
    생성한 폴더를 chmod 777 권한을 주면 잘 됩니다 ^^;
    대화보기
    • 고스트프리
      Xshell를 설치해서 따라하고있는데 3번째 동양상 따라할려면 어떻게 해야될까요?
      제대로 안되네요.. 설명 해주실분....

      일단 폴더 접근해서 list를 치게되면 목록이 아무것도 안나옵니다.
    • 고스트프리
      이제 조금씩 어려워지네요^^
    • 다시시작
      완료
    • 고스트프리
      열심히 달리겠습니다.
    • kimjs9105
      감사합니다~~~~
    • sheis
      잘 봤어요^^
    • 심화평
      17.07.17 ㄱㅏ ㅅㅏㅎㅏ ㄴㅣㄷㅏ
      ㅁ ㅂ
    • jhkwak313
      '파일을 다루는 과정에서 발생할 수 있는 문제들' 여기서 사용했던 검정색 배경에서 코드 작성한것 들어가는 방법이랑도 설명 좀 있으면 좋겠네요..
      그리고 이고잉님이 일부로 에러를 주어서 검정색배경의 프로그램에서 명령을 주어 변경한것도 어떻게 에러를 줬는지 설명을 주시면 좋겠어요.
    • 질문합니다.
      centos7 사용자입니다.
      php로 공부하는 데 fopen() 함수를 사용하는 데 권한 거부가 뜨네요..
      /var/www/html/chapter02/orders/orders.txt, ab 를 인자값으로 줬습니다..

      해당 폴더 orders를 권한에 chmod 777을 줘서 풀권한을 줬어도 안되서
      root권한으로 chmod -R 777 / 을해서 가능한 모든 폴더 및 파일을 풀권한을 줬는데도..안되네요....

      왜그런건가요 ㅜㅜ centos6 사용할 때는 진행이 되었는 데 새로운 os 설치 후엔 fopen에서 권한 오류가 나네요,...;
    • 질문합니다.
      centos7 사용자입니다.
      php로 공부하는 데 fopen() 함수를 사용하는 데 권한 거부가 뜨네요..
      /var/www/html/chapter02/orders/orders.txt, ab 를 인자값으로 줬습니다..

      해당 폴더 orders를 권한에 chmod 777을 줘서 풀권한을 줬어도 안되서
      root권한으로 chmod -R 777 / 을해서 가능한 모든 폴더 및 파일을 풀권한을 줬는데도..안되네요....

      왜그런건가요 ㅜㅜ centos6 사용할 때는 진행이 되었는 데 새로운 os 설치 후엔 fopen에서 권한 오류가 나네요,...;
    • 김세창
      "파일을 다루는 과정에서 발생할 수 있는 문제들" 부분은 윈도우는 필요없는건가요??
    • php가첫취업?
      일단 이런 함수가 있다는것만 기억하고 재 복습해야할듯 싶습니다..
    • funlife
      감사합니다.
    • 노노재노재노창
      으렵구만
    • 주재학
      파일 제어는 항상 GUI 환경에서 하던 거라서 꽤나 까다롭게 느껴지네요 ㅠ 특히 권한-보안 문제...흙... 한번 다시 돌려봐야겠습니당 ㅎㅎ
    • park
      파일을 읽고 쓰기 위해서는 권한이 있어야되는데 없다면 직접 구너한을 부여해야된다 그런거군요
    • 껄렁걸
      고잉형 몰라룐~!
    • NamJin Kim
      감사합니다
    • php 살짝 어렵네~
      파일을 다루는 과정에서 발생할 수 있는 문제들 << 여기서부터 갑자기 어려워지네용 ㅠ_ㅠ
      알아둬야지 하는 심정으로 봤습니다. 흑흑
    • 신입1
      감사합니디!
    • Kyouwon Lee
      감사합니다^^
    • JustStudy
      고맙습니다
    • 고고1
      여기부터 어렵게 느껴져여 ㅜㅜ
    • 정민규
      골 아프고 부러우면 지는거다 힘 내야지 ㅠㅠ
    • 쥬슈야
      이번강좌를 보니 드롭박스나, N드라이브 같은 클라우드 파일관리(?)서비스 들이 얼마나 복잡할지 느낌이 오는군요;;
      스마트폰과 PC에 동시에 동기화도 시켜야 하고..
    • 코딩!
      아 이건 좀 어렵네요 ㅋㅋ
    • thexl
      오 권한 땜에 안 됐었는데, 감사합니다
      대화보기
      • irunjegil
        좋은 강의 좋은 내용으로 항상 감사하며 공부를 하고 있었습니다.
        그런데 한 강의 부분에서 흐름이 확 깨져버렸습니다.
        파일제어트러블 슈팅 강의가 상세하게 설명이 되지 않아서
        트러블 슈팅하는 방법을 모르겠고 그것을 알아야
        항후 PHP 애플리케이션을 제작할 때 기본바탕이 될 것일 텐데..
        xshell5를 우선 다운을 받기는 하였으나
        하는법을 모르니... 답답하고 속상한 마음입니다....
      • sssssqew
        리눅스 사용하시는 분들 파일 복사하기 전에 복사하려는 파일이 속한 현재 디렉토리에 대해 자신이 소속된 권한종류(소유자, 그룹, 전체)에서 쓰기(w)와 실행(x) 권한이 꼭 필요합니다.

        예를 들어보면, 저같은 경우 /var/www/filePHP 가 현재 디렉토리이고, 그 아래 fileLearn.php 와 readme.txt 가 있고, 소유자 권한을 가지고 있다면, 최소한

        d-wxrwxrwx 나 drwxrwxrwx 가 되면 됩니다. 뒤에 그룹이나 전체에 대한 권한에 상관없이 소유자 권한은 최소한 쓰기와 실행권한이 있어야 파일복사가 됩니다.

        권한변경은 chmod 이고 rwx에 각각 값을 부여하여 r : 4, w : 2, x :1 입니다.
        예를 들면 chmod 777 . 이라고 하면 점(.)은 복사하려는 파일이 속해있는 현재 디렉토리를 의미하고 소유자, 그룹, 전체에 상관없이 읽기,쓰기, 실행의 모든 권한을 부여한다는 의미입니다.

        저는 리눅스를 사용한지 얼마 안되고 단지 실제로 해보고 말씀드리는 것이라 혹시 제가 잘못 설명한 부분이 있으시면 고수님들이 다시 수정해주시면 감사하겠습니다.
      • Allen Cho
        bitnami 로 phpmyadmin 을 실행하려고 하면

        Fatal error: Call to undefined function mb_detect_encoding() in C:\Bitnami\wampstack-5.4.33-0\apps\phpmyadmin\htdocs\libraries\php-gettext\gettext.inc on line 177

        이라고 뜨는데 혹시 아시는 분 계신가요?
      • 샤핀
        감사합니다.
      • chase
        chmod -Rf 777 명령도 혹시 써보셨나요?!
        이런 권한 문제로 안되시면 차라리 apache2 의 directory 설정을 루트권한이 필요 없는곳으로 바꾸셔도 되요.
        저는 var/www 에서 작업하면 매 수정할때마다 root권한을 얻어야 해서 그냥 home directory로 localhost 경로를 변경했습니다.
        방법은,
        1. /etc/apache2/apache2.conf 에서 <Directory /var/www/> 를 찾으신 후, /var/www 이 부분을 사용자권한으로 접근할 수 있는 경로로 지정하시면 됩니다. ex) <Directory /home/사용자명/Desktop>
        2. /etc/apache2/sites-available/000-default.conf 에서 DocumentRoot /var/www/html 을 찾으신 후, 1번에서 지정한 경로를 써주시면 됩니다. ex) DocumentRoot /home/사용자명/Desktop

        이렇게하시고, apache2를 재시작 하시면 될듯 합니다.
        약간 핀트는 어긋났지만 문법적 오류가 아니라 권한오류때문에 문제가 생기면 어떻게든 해결을 해야하지 않을까요 ㅎ
        대화보기
        • bara
          너무 어렵네요.
          저번에도 여기서 막혀서 결국 그만두고 다시 처음부터 듣는데, 또 이러네요.

          파일복사와 파일삭제가 안됩니다.
          <?php
          $file = 'test.txt';
          $newfile = 'example.txt.bak';

          if(!copy($file, $newfile)) {
          echo "failed to copy $file...\n";
          }
          ?>
          로 해놓으면

          에러메시지가 이렇게 뜹니다.
          Warning: copy(example.txt.bak): failed to open stream: Permission denied in /var/www/html/1.php on line 5
          failed to copy


          파일삭제시에는
          Warning: unlink(deleteme.txt): Permission denied in /var/www/html/4.php on line 2

          이들 파일이 있는 곳의 권한은
          drwxr-xr-x 5 ubuntu root 4096 Jun 12 06:39 .
          이렇게 되구요.

          파일복사에 쓰는 파일 권한은
          -rw-r--r-- 1 ubuntu root 33 Jun 12 05:59 test.txt

          마지막으로 삭제할 파일 권한은
          -rwxrwxrwx 1 ubuntu ubuntu 19 Jun 12 06:18 deleteme.txt

          삭제할 파일 권한이 저렇게 이상한 모습인 것은
          구글 검색으로 권한을 chmod 777 파일명 .. 이렇게 바꾸면 된다고 해서 했는데, 바꾸기 전과 동일하게 에러메시지가 뜨네요.

          도대체 왜 이런건가요? 도와주세요.
        • egoing
          단순한 html 페이지라면 file_get_contents를 사용하시는 것도 괜찮은 선택입니다만, 프로그래밍적인 로직을 담고 있는 페이지라면 http://opentutorials.org......138 를 사용하셔야겠지요?
          대화보기
          • ejaguar211
            정말 깔끔한 표현력으로 이런 어려운 개념들을 잘 설명하시다니 매번 공부하러 올때마다 감탄하고 갑니다.
            홈페이지를 제작하는 중 php를 통해 소개 및 가입 등의 조각조각 만들어진 html페이지들를 통합해보고자 합니다.
            원래 이렇게 하는게 맞는지도 모르겠네요.^^;
            그동안 페이지별로 따로 만들어둔 html파일들을 index.php에 기본적으로 갖춘 양식(header 및 footer)과 연동시키는 과정을 시도하고 있습니다.

            file_get_contents()을 써서 할 수 있는것인지 궁금합니다. url이 아니라 운영하는 호스팅서버 내 저장된 html파일을 불러오는 것인데 그렇게 하는 것이 제대로 하는 걸까요? 올바른 방향으로 가고 있는지 모르겠습니다. 검색에 한계를 느끼고 결국 댓글을 다네요. 아래 패션테러리스트님이 말씀하시는 부분도 왠지 맘에 걸리구요.
          • superjang
            xshell 이라는 프로그램입니다.
            개인사용자는 무료인걸로 알고 있습니다.
            공식사이트에서 다운로드 가능합니다 ㅎ
            대화보기
            • Oenomel
              윈도우 cmd 가 아니라 리눅스 터미널 상에서 하신 것 같습니다
            • 베타로그
              파일제어 트러블 슈팅 영상에서 사용하신 프로그램이 뭔가요?

              cmd로 하려고 하니까 표시가 안되네요.
            • 패션테러리스트
              file_get_contents함수를 사용할 때 서버안에 있는 파일은 제어가 쉬운 반면에 네트워크를 이용한 데이터 읽어오기에서 위의 함수를 사용할 경우 warning이 발생 될 수 있습니다. 이때에는 php.ini파일을 수정해 주어야 합니다.
              (자세한건 구글에서 file_get_contents로 검색해보시면 많이 나와있습니다.^^) 그러나 php.ini파일을 수정해준다는건 보안상 안전하지 못하다고 합니다.
              네트워크를 이용하여 데이터를 가져올때 (이것을 파싱(parsing)이라고 합니다.) 위의 경고때문에 하기 어려우신 분들이 계시다면 Snoopy를 사용해보시기를 추천합니다.