フォルダの属性について

このQ&Aのポイント
  • MediaWiki1.2でサイト作成中のフォルダの属性についての質問です。
  • 画像をアップロードするとフォルダが2つ自動作成されますが、パーミッションについて問題があります。
  • 特定のフォルダのパーミッションを指定して変更する方法を教えてください。
回答を見る
  • ベストアンサー

フォルダの属性について 別途

MediaWiki1.2でサイト作成中です。 画像(test.jpg)をアップロードするとフォルダが2つ自動作成されます。 例:サイトルート/images/5/2a/test.jpg imagesフォルダはデフォルトで存在するもので、「5」「2a」が自動で作成されます。 前回、「5」「2a」のフォルダのパーミッションが644になって不具合が出てしまうので質問しました。 chmodを利用すると、「2a」フォルダだけは777にすることはできました。 ディレクトリ作成と思われるソース抜粋は以下の通り。 /** * Make directory, and make all parent directories if they don't exist * * @param $dir String: full path to directory to create * @param $mode Integer: chmod value to use, default is $wgDirectoryMode * @param $caller String: optional caller param for debugging. * @return bool */ function wfMkdirParents( $dir, $mode = 0777, $caller = null ) { global $wgDirectoryMode; if ( FileBackend::isStoragePath( $dir ) ) { // sanity throw new MWException( __FUNCTION__ . " given storage path '$dir'." ); } if ( !is_null( $caller ) ) { wfDebug( "$caller: called wfMkdirParents($dir)\n" ); } if( strval( $dir ) === '' || file_exists( $dir ) ) { return true; } $dir = str_replace( array( '\\', '/' ), DIRECTORY_SEPARATOR, $dir ); if ( is_null( $mode ) ) { $mode = $wgDirectoryMode; } // Turn off the normal warning, we're doing our own below wfSuppressWarnings(); $ok = mkdir( $dir, $mode, true ); // PHP5 <3 chmod($dir,0777); wfRestoreWarnings(); if( !$ok ) { // PHP doesn't report the path in its warning message, so add our own to aid in diagnosis. trigger_error( sprintf( "%s: failed to mkdir \"%s\" mode 0%o", __FUNCTION__, $dir, $mode ), E_USER_WARNING ); } return $ok; chmod($dir,0777); } ※chmodの使用タイミングが理解未熟なので、2か所に登場しています。 「$dir」はフルパスなんですが、上記方法だと「2a」だけ777になって「5」フォルダは777にならないのです。 そこで、 「$dir」のひとつ上の階層(最下層のひとつ上になります)のフォルダのパーミッションを指定して777にしたいのですが、どのようにすればよいのでしょうか。上記例の場合、「5」フォルダの名称は自動生成なので「../5」のようにソースに書けなくて困っています。

  • PHP
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • thezen5
  • ベストアンサー率84% (27/32)
回答No.2

mkdirで直接パーミッション指定したらどうですか? $ok = mkdir( $dir, 0777, true );

partita
質問者

お礼

回答ありがとうございます。 直接でもダメでした。 試行錯誤の末、2か所のchmodの直前でそれぞれumask(0)を実行するとうまくいきました! 解決はしましたが、なぜそれでうまくいくのか、ご提案の方法等でうまくいかないのかがよくわかりません。サーバーの仕様も、どの程度影響していたのか…(ほかのサーバーでは不都合が生じなかった)。

その他の回答 (2)

  • thezen5
  • ベストアンサー率84% (27/32)
回答No.3

global $wgDirectoryMode; の後にumaskを実行したらどうでしょうか?

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

$ok = mkdir( $dir, $mode, true ); これをやっているならchmodは不要だと思います($modeでおかしなものを引き渡していない限りですが)。 imagesディレクトリの所有者とパーミッションはどうなっていますか?そして、images/5の所有者は?セーフモードのためにimages/5を0777にできない(imagesの所有者と違う)ということではありませんか?(images/5を作れば、images/5/2aはimages/5と同じ所有者なので・・・) http://jp1.php.net/manual/ja/function.mkdir.php

partita
質問者

補足

早速の回答ありがとうございます。 >これをやっているならchmodは不要だと思います 私も必要ないと思ってましたが、削除すると、「5」「2a」いずれも0777になりませんでしたので、何らかの理由で必要だと思われます。 >imagesディレクトリの所有者とパーミッション、images/5の所有者 所有者はいずれも同じ(FFFTPの「所有者」項目で確認)。 imagesのパーミッションは777になっています。 また、phpinfoで確認したところ、safe_modeはoffになっていました。 補足ですが、サーバーの仕様によると 「新規作成ディレクトリの初期パーミッションは701」となっていますが FFFTPソフトを使用してサーバー側に手動でフォルダを作成すると755になります。 よろしくお願いします。

関連するQ&A

  • PHPでディレクトリーとそのサブディレクトリー表示

    PHPでディレクトリーとそのサブディレクトリーの中のファイルを表示して、ファイルであればダウンロード用のリンクを付け加えたいと思いますが、ここで嵌ってしまっています。 以下はソースコード(コメントアウトされている部分は試したコード、すべてだめだった) $dir = $_SERVER['DOCUMENT_ROOT'].'/projects/website/uploaded'.'/'.$_GET['user']; function getDirContents($dir) { global $basedir; $path=pathinfo($dir); $path1=$basedir.'/'.basename($dir); //echo $path1; //$path1=basename($dir); if (is_dir($dir)) { //$path1 .= basename($dir); //$path1 .='/'.basename($dir); $dirs = explode('/', $dir); $last_dir = $dirs[count($dirs) - 1]; echo '<strong>'.$last_dir.'</strong>'; if ($dh = opendir($dir)) { echo '<ul>'; while (($file = readdir($dh)) !== false) { if ($file == '.' || $file == '..' || substr($file,0,1)=='.') {} else { echo '<li>'; if (is_dir($dir.'/'.$file)) { $path1 .='/'.basename($file); getDirContents($dir.'/'.$file); } else { //echo $path1; $path2=pathinfo($path1); echo '<a href="'.$basedir.$path1.'/'.$file.'">'.$file.'</a>'; } echo '</li>'; } } echo '</ul>'; closedir($dh); } } return false; } getDirContents($dir); 因みにウェブサイトは、サーバーの/projects/website/にあります。表示したいフォルダはprojects/website/uploaded/にあります。そしてサブフォルだは/projects/website/uploaded/(ユーザ名)/(フォーム番号)/ わかる方がいらっしゃいましたら、ご回答を宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • UNIXの"find"コマンド同等のプログラム作成について

    お世話になっております。 現在UNIXの"-type f"オプションのついた"find"コマンドと同等のプログラムをC言語で作ろうとしています。 つまりディレクトリ内のファイル(サブディレクトリ内のファイル含む、ディレクトリは除外)を全てフルパスで表示するプログラムです。 現在下記の関数を作成したのですがうまく動いてくれません。 どなたかご教授いただけないでしょうか。 【問題】 プログラム内の(**)前後で"dir1"が変更される。 (**)前:"/ディレクトリA/" (**)後:"/ディレクトリA/ディレクトリA内のファイル1" 本当は"dir1"には:"/ディレクトリA/"のままであってほしいです。 "strcat"コマンドの仕様が影響しているのでしょうか。 int _find(char dir1[] , int k ,int l , int m ) { DIR *dir ; struct dirent *dp ; struct stat statbuf ; char txt[1000] ; if ( m == 0 ) l++ ; if ( (dir = opendir(dir1)) == NULL ){ printf("%s",dir1) ; perror("opendir") ; exit(1) ; } for( dp=readdir(dir) ; dp != NULL ; dp=readdir(dir) ){ if ( strcmp(dp->d_name,".") != 0 && strcmp(dp->d_name,"..") != 0 ){ /* ROOT_DIR名-にファイル名を付け加えて、フルパスにする */ strcpy( temp[k][l] , dir1) ; strcat( temp[k][l] , "/" ) ; strcat( temp[k][l] , dp->d_name ) ;  (**) stat( temp[k][l] , &statbuf ) ; if(S_ISDIR(statbuf.st_mode)){ l=_find(temp[k][l],k,l,1) ; }else{ sort[k][l]=temp[k][l] ; printf("temp[%d][%d]=%s\n",k,l,sort[k][l]); printf( "dir5=%s\n",dir1) ; l++ ; } } } closedir(dir) ; return l ; }

  • ディレクトリ内一覧表示

    現在PHPにてディレクトリ内の中のディレクトリ一覧を作成しています。 わからないことがあり、ご投稿させていただきました。 imageフォルダの中に 20110101フォルダと20100101フォルダを作成しています。 imageフォルダ内のディレクトリを一覧表示させたいのですが、下記ソースですと、20110101しか表示されません。 おわかりの方がいらっしゃいましたらご教示お願いします。 $path = 'imageフォルダまでの絶対パス'; $dir = scandir($path, 1);//フォルダ内降順指定 if($dir != "." && $dir != "..") { $dirArray = array($dir); foreach($dirArray as $dir => $val) { for($i = 0; $i <= $dir; $i++) { $dirName = count($dirArray); echo $val[$dirName]; } } } closedir($dir); 宜しくお願いします。

    • ベストアンサー
    • PHP
  • 消せないフォルダ 消してしまいたい!

    容量0の消せないフォルダがあります。 DOS窓で del や rd コマンドを使用したのですが、 消せませんでした。 どうしてでしょう。 c:\windows\デスクトップ>dir >a.txtを実行した結果は 下記の通りです。 . <DIR> 00-09-17 11:10 . .. <DIR> 00-09-17 11:10 .. ブリーフケース <DIR> 00-09-17 11:19 ブリーフケース A TXT 0 02-05-31 17:43 a.txt 新しい~1 <DIR> 02-05-31 17:42 新しいフォルダ 12_ <DIR> 02-05-30 20:42 12_3 123沺_ <DIR> 02-05-30 20:43 123___ 1 個 0 バイトのファイルがあります. 6 ディレクトリ 4,244.81 MB の空きがあります. 半角はこの掲示板では表示されないようですね。 みににくくて、すみません。  削除したいフォルダは12_3と123___ です。 起動ディスクから削除しようと思ったのですが、起動ディスクからの場合、「デスクトップ」という文字を入力できませんでした。 英数字しかだめなようです。

  • EXCEL フォルダだけを検索したい

    EXCEL2003を使っています。 開いているファイルと同じフォルダ内に「テストフォルダ」があるかどうかを調べ、存在した場合に削除したいのですが、以下のような書き方ではフォルダだけでなくファイルも検索してしまうようです。 フォルダだけを検索するにはどうしたらいいでしょうか? FSOでできることは分かっていますが、以下の方法で試してみたいのです。どうぞ宜しくお願い致します。 Sub test() my_path = ActiveWorkbook.Path & "\" f_name = Dir(my_path, 16) Do Until f_name = "" If f_name = "テストフォルダ" Then RmDir "テストフォルダ" End If f_name = Dir() Loop End Sub

  • PHPを使ってのサーバ上ファイルのパーミッションの変更方法

    PHPおよびPEARを使って、FTPサーバ上のファイルのパーミッションの変更をしたいと考えています。 具体的には、 PEARを利用し、$ftp->put()でアップしたファイル($filename)を、700に属性変更したいのです。 ソース上は、 chmod($filename, 0700); と書いています。 ところが、実行すると以下のようなワーニングが出ます。 「Warning: chmod() [function.chmod]: No such file or directory in ・・・」 今度は、 $ftp->chmod($remote_folder[$i]. $filename, 0700); と書いて実行してみるとエラーは出ません。 しかし、パーミッションは変わっていませんでした。 次に、 「PEARの命令を使って実行すればいいんだ!」と考えて、 $ftp->execute(chmod($filename, 0700)); と書いて実行してみました。 結果は、最初と同じ、 「Warning: chmod() [function.chmod]: No such file or directory in ・・・」 というワーニングでした。 いったい何がいけないいんでしょうか(--; phpのマニュアルを見ると、chmodに、「この関数では、 リモートファイルを使用することはできません。」とあります。 が、教えて!gooなどで検索してみると、chmodを使って普通にサーバ上のファイルのパーミッションを変更している書き込みが見られます。 正直、混乱しているというか、よく分からない状態です。 皆様、気がついた点などありましたら、是非、アドバイスお願い致します。

    • ベストアンサー
    • PHP
  • class内部でarray_mapをつかうとき、なぜこのような記述をしなければならないのでしょうか?

    PHP Version 5.1.6 です。 以下のようなクラスを書いていたのですが、 //----------------------------------------------------------- class PreventAttack{         public static function TopStaticMethod(){             self::ExcludeNullbyte();         }                  private static function ExcludeNullbyte(){             $_GET = self::ExcludeNullbyte_Exec( $_GET );             $_POST = self::ExcludeNullbyte_Exec( $_POST );             $_COOKIE = self::ExcludeNullbyte_Exec( $_COOKIE );             return;                  }             private static function ExcludeNullbyte_Exec($param){              if ( is_array( $param ) ) {              return array_map('ExcludeNullbyte_Exec', $param );              }              return str_replace( "\0", "", $param );             } } //----------------------------------------------------------- Warning: array_map() [function.array-map]: The first argument, 'ExcludeNullbyte_Exec', should be either NULL or a valid callback in /var/www/(中略)include/class/PreventAttack.class on line 39 と怒られてしまいました。 39行目は、下から5行目のarray_mapのところです。 で、このエラーメッセージでグーグルで検索して、いろいろたどっていったら、 http://jp.php.net/manual/ja/language.pseudo-types.php#language.types.callback にたどりつき、 このページのユーザコメント欄に、 //----------------------------------------------------------- To recap mr dot lilov at gmail dot com's comment: If you want to pass a function as an argument to another function, for example "array_map", do this: regular functions: <? array_map(intval, $array) ?> static functions in a class: <? array_map(array('MyClass', 'MyFunction'), $array) ?> functions from an object: <? array_map(array($this, 'MyFunction'), $array) ?> I hope this clarifies things a little bit //----------------------------------------------------------- と書いてあったので、 return array_map(array('ExcludeNullbyte_Exec', $param ); のところを、 return array_map(array('PreventAttack','ExcludeNullbyte_Exec'), $param ); に変えたら、エラーがなくなりました。 ・・・が、その理屈がいまいちわかりません。 どなたかおわかりの方がいらっしゃいましたら、お教えいただけないでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • phpのディレクトリーorファイルのパーミッション

    お世話になります。 どうやってもうまくいかないので、質問させていただきます。 phpでログファイルを書き込むようにしたいのですが、 ファイルが作成されません。 根本的なところができていないのだと思いますが、教えてください。 やりたいことは、指定のパス(docomwnt_root配下の/logまたは include/log) にyyyymmdd.logで、テキストを書き込みたいのです。 いろいろ調べて、ディレクトリの場合は 0777、ファイルは0666にchmodすればよいとのことで 変更したのに、ファイルがないといわれてしまいます。 ソースコードは以下になります。 すみません、試行錯誤の名残とdebug行が入っています。 <?php //function logout($content){ $content="test"; error_log($content,0); //ログファイル設定 // $logpath = '/log'; // if( !is_dir($logpath) ){ // die("ディレクトリが存在しません -->". $logpath); // } //日時取得 $dateobj = new DateTime(); //アクセスタイム取得 $accessTime=$dateobj->format('Y-m-d H:i:s'); //書き込む内容 $log = $accessTime . " " . $content . "\n"; // ファイル名 $date = $dateobj->format('Ymd'); // $filename = realpath( $logpath ) . '/'.$date . '.log'; // $filename = dirname(__FILE__) . '/log/'. $date . '.log'; $filename = $date . '.log'; echo $filename; $directory_path = "./log"; if( mkdir( $directory_path, 0777) ){ echo "ok<br>"; chmod( $directory_path, 0777); } else{ echo "ng<ng>"; } if( !$fp = fopen($filename, 'ab') ){ echo "cannot open file($filename)<br>"; return -1; } if( !$fp = flock($fp, FILE_APPEND | LOCK_EX) ){ echo "cannot open file($filename)"; return -1; } if( fwrite($fp, $content) === FALSE){ echo "cannot write file($filename)<br>"; return -1; } if( !fclose($fp) ){ echo "cannot close file($filename)"; return -1; } // return 0; //} ?> この場合だと cannot open file になってしまいます。 windowsばかりやってきていたのでlinuxは、、、わかりません。 いろいろ、サンプルを試しているのですが、うまくいかなくて。。。 すみません、ご指導よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPで、フォルダーにあるファイルを配列に取り込みたい

    例えば次の様なフォルダーとファイルがあるとき \abc\a.txt \abc\b.doc \abc\def\b.doc \abc\ghi\a.txt \abc\ghi\b.doc 次の様な結果を得たいのですが、どうすれば良いでしょうか? $dir[/abc/a.txt] = "/abc/a.txt" $dir[/abc/b.doc] = "/abc/b.doc" $dir[/abc/def/b.doc] = "/abc/def/b.doc" $dir[/abc/ghi/a.txt] = "/abc/ghi/a.txt" $dir[/abc/ghi/b.doc] = "/abc/ghi/b.doc" 再帰関数でできそうに思うのですが、いくら考えても分かりません。 $path = "\abc"; function getfiles($path) {} print_r(getfiles($path)); みたいにして取り出せると助かります。 すみませんが教えてください。

    • ベストアンサー
    • PHP
  • 12/18~12/22でMySQL Commandline Clien

    12/18~12/22でMySQL Commandline Client のAjax+JavaBeans版を作成中。 「明日までに」ということで焦っています。 なぜなら、リモートメソッドが完全動作しないからです。 Eclipse 3.3 Europe Version: 3.3.2 TOMCAT 5.5 JAVA 5.0 DWR <Java リソース>  +--- dbAccess/DirectDAO.java <------ OK!  +--- sqlService/DirectSQL.java <---- ダメ! <WebContent>  +--- DWR/interface/DirectDAO.js、DirectSQL.js  +--- WEB-INF/web.xml <web.xml> <init-param> <param-name>classes</param-name> <param-value>sqlService.DirectSQL</param-value> </init-param> <init-param> <param-name>classes</param-name> <param-value>dbAccess.DirectDAO</param-value> </init-param> <DirectSQL.js> // Provide a default path to dwr.engine if (dwr == null) var dwr = {}; if (dwr.engine == null) dwr.engine = {}; if (DWREngine == null) var DWREngine = dwr.engine; if (DirectSQL == null) var DirectSQL = {}; DirectSQL._path = '/mwc/dwr'; DirectSQL.doCmd = function(p0, callback) { dwr.engine._execute(DirectSQL._path, 'DirectSQL', 'doCmd', p0, callback); } (1)DirectSQLのみの時は、DirectSQL.doCmd()がDWRテストページでテスト可。 (2)DirectSQLのみの時は、DirectSQL.doCmd()をJavaScript関数から呼び出し可。 (3)DirectDAOを追加後は、DirectDAO.XXXXX()がDWRテストページでテスト可。 つまり、二つのリモートメソッドクラスを同時に使えないということです。 <質問>一体、なぜ、二つのリモートメソッドクラスを同時に使えないのでしょうか? 当方、Javaを知って6ヶ月という初学者です。 どうぞ、宜しく回答のほどお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう