CGIの動作確認方法を教えてください

このQ&Aのポイント
  • CGIの動作確認方法を教えてください。
  • サイト内検索をするために、ダウンロードしたモジュールがうまく動作しません。
  • index.cgiで動作しているかどうか確認する方法を教えてください。
回答を見る
  • ベストアンサー

CGI の動作確認方法をご教示お願いいたします

サイト内検索を付けたくて、以下のサイトよりモジュールをダウンロードしました。 http://www.synck.com/contents/download/cgi-perl/sitesearch_crw.html CGIの設定環境(CGI設置場所、Perlのパス、Encodeモジュールの存在、パーミッション) についてはサーバー管理者に確認済みで、問題ないのですが、実行してもエラーも出ず、 うんともすんとも言わない状態です。 HTML からは、以下のように呼び出しがされています。 ------------------------------------------------------------------------------- <form class="sitesearch" method="get" action="index.cgi" onsubmit="return sitesearch(this);"> <input type="text" name="q" value="" /> <input type="submit" value="サイト内検索" /> ------------------------------------------------------------------------------- action で呼び出しているindex.cgi で動いているかどうか確認する方法を 教えていただけませんでしょうか。 一応、index.cgi の最初の方にメッセージを入れてみたのですが、表示されませんでした。 以下は、index.cgi の一部です。 ------------------------------------------------------------------------------- #!/usr/bin/perl ## 京 use Encode; require './init.cgi'; &_GET; my(@keys) = split(/ /,$_GET{'q'}); print "テスト\n"; ←こんな感じにメッセージいれました。 ## int $totime = time(); if((-f $config{'cache'}) && (((stat($config{'cache'}))[9] + 60 * $config{'expiration'}) > $totime)){ ## Load Cache @pages = &_LOAD($config{'cache'}); } else{ ## Create Cache push @dirs,$config{'dir'}; while($cnt < @dirs){ $dir = $dirs[$cnt]; opendir DH, $dir or die "$dir:$!"; while (my $file = readdir DH) { next if $file =~ /^\.{1,2}$/; $currentpath = $dir . $file; if(-d $currentpath && (grep(/^${file}$/,@excluded_dirs_name)) == 0){ push @dirs, "${currentpath}/"; } elsif((split(/\./,$currentpath))[-1] =~ /htm/si){ $html = join("",&_LOAD($currentpath)); $html =~ s/\t//ig; $html =~ s/\r//ig; $html =~ s/\n//ig; my ($tilte,$snippet,$keywords,$contents,$thumbnail); if($html =~ /<title>(.*?)<\/title>/si){ $title = $1; if($title =~ /$config{'title_regex'}/){ $title = $1; } } if($html =~ /<meta.*?name=\"Description\".*?content=\"(.*?)\"/si){ $snippet = $1; } if($html =~ /<meta.*?name=\"Keywords\".*?content=\"(.*?)\"/si){ $keywords = $1; } if($html =~ /$config{'body_regex'}/){ $contents = $1; $contents =~ s/<script.*?\/script>//g; $contents =~ s/<.*?>//g; } ## Thumbnail $thumbnail_path = "${dir}images/thumb_${file}\.jpg"; if(-f $thumbnail_path){ $thumbnail = $thumbnail_path; $thumbnail =~ s/$config{'uri_replace_before'}/$config{'uri_replace_after'}/i; } @file_info = stat($currentpath); ($sec,$min,$hour,$day,$mon,$year) = localtime($file_info[9]); $file_updatetime = sprintf("%04d-%02d-%02d %02d:%02d:%02d",$year+1900,$mon+1,$day,$hour,$min,$sec); $file_size = int($file_info[7] / 1024); $currentpath =~ s/$config{'uri_replace_before'}/$config{'uri_replace_after'}/i; @page = ($currentpath,$thumbnail,$title,$snippet,$keywords,$contents,$file_updatetime,$file_size); push @pages,join("\t",@page); } } closedir DH; $cnt++; } ------------------------------------------------------------------------------- よろしくお願いいたします。

  • CGI
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.2

>うんともすんとも~ ということはjavascriptの問題ではありませんか? onsubmit="return sitesearch(this);" とありますが、必要なJavaScriptファイルは取り込んでいますか? Ajaxモードであれば、検索結果を表示するための <div id="search_result"></div> はHTMLのどこかに記入されていますか? あるいは onsubmit="return sitesearch(this);" を削除して送信すると結果はちゃんと表示されますか? (あるいは直接 http://~/index.cgi?q=aaaなどでアクセスしてみる)

poifulls
質問者

お礼

早々にご回答いただきありがとうございました。 --------------------------------------------- onsubmit="return sitesearch(this);" を削除して送信すると結果はちゃんと表示されますか? --------------------------------------------- これがヒントになりました。 Internal Server Errorが出まして、そこから確認してみると ファイルの転送モードがバイナリになっていることが原因でした。 お恥ずかしい話、CGIはASCIIモードで転送するものだということを 知りませんでした。。。 とても助かりました。ありがとうございました!

その他の回答 (1)

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

出来ればCGIはサーバーで動作させる前にローカルでテストすべきですが・・ シェルが使えるなら、シェルからステップごとに動作を追っていく。 シェルが使えないなら、  print の対象をファイルにして出力している内容をテキストに書き出す。  BEGIN{}コマンドを付け加えて、エラーを書き出す とか  一番よいのは、シェルから、一行ずつ動作させていくのでしょうが?? >一応、index.cgi の最初の方にメッセージを入れてみたのですが、表示されませんでした。  の意味がわからないのですが、きちんとHTTPD応答ヘッダを書きましたか?  他人のスクリプトを解析して、本人でもわからないエラーを見つけるのは、大変な作業です。ん万円もらっても断る。  とにかく自力で解決してください。 ※ローカルにテスト環境を作りましょう。  apacheとactivePerl。CYGWINだとシェルも使える。

poifulls
質問者

お礼

早々にご回答いただきありがとうございました。 お恥ずかしい話、私の知識不足で・・・ ファイルの転送モードがバイナリになっていたことが原因でした。 また、アドバイスもありがとうございます。

関連するQ&A

  • chmod 教えてください

    PHP素人です。 使用しているサーバーの制限で、アップロードした画像のパーミッションが600になってしまい、画像が見れません。chmodを使用すると解決できますとのことだったので、色々調べてchmod{"$dir/$fname",0604}と入れてみたのですが、場所が違うのか、構文の書き方が違うのか、うまくいきません。 根本的なところから間違っているのかもしれませんが、どうかご教授よろしくお願いします。 $mes = ''; if(!empty($_POST['dir'])){ $dir = EXTRACT_PATH.'/'.$lid.'/thumbnail/'.$myts->stripSlashesGPC($_POST['dir']); if(!is_dir($dir) && !mkdir($dir, 0777)){ $mes = _ND_DIR_FALSE;} }else{ $mes = _ND_CONFIG_INPUTDIR;} if(!empty($mes)) redirect_header(MOD_URL.'/config.php?lid='.$lid.'&mode=thumb', 1, $mes); if(is_uploaded_file($_FILES['userfile']['tmp_name'])){ $fname = $_FILES['userfile']['name']; $tmp_name = $_FILES['userfile']['tmp_name']; if(preg_match("/.*(\.gif)$/i", $fname)){ if(move_uploaded_file($tmp_name, $dir.'/'.$fname)) { $mes = _ND_CONFIG_IMGUPOK; }else{ $mes = _ND_CONFIG_IMGUPNG;} }else{ $mes = _ND_CONFIG_UPSUF;} }else{ $mes = _ND_CONFIG_NFILESELECT;} redirect_header(MOD_URL.'/config.php?lid='.$lid.'&mode=thumb', 1, $mes); break;

    • ベストアンサー
    • PHP
  • 一番大きいファイルを探し出すCGI…が動かない!

    ホームページ作成中です。 以前ここで「あるフォルダ内に連番のhtmlファイルが自動作成され(1.html,2.html~~)、その中で一番数が大きいファイルを表示するCGI」というのを質問させていただきました。 その後すぐ回答が来て、なんとCGIを作っていただいたんです。で、試しに使ってみると(5~6枚くらい)、無事新しい方(数が多い方)を読み込んでくれていたので、感謝の気持ちと共に質問を解決させていただきました。 しかし、後になって問題が発生しました。 桁が上がると、新しい物を表示してくれないのです。 9.html,10.htmlがあると、9htmlの方を表示してしまうんです。 ソースは以下の通りですが、どこを変えることで2桁、3桁と対応可能でしょうか?自動生成するCGIに0001.htmlというように吐き出させればいいのかもしれませんが、そうする技術も無いので… よろしくお願いします。 ------------------------------------- #!/usr/bin/perl $DIR = "./se3_diary/"; $new = 0; opendir(DIR,$DIR); while ( $file = readdir(DIR) ) { if ( $file =~ /^(\d)+\.html$/ ) { $new = $1 if ( $new < $1 ); } } closedir(DIR); open(IN,"$DIR$new.html"); $src = join("",<IN>); close(IN); print "Content-Type: text/html\n\n"; print $src; exit();

    • ベストアンサー
    • CGI
  • perl-cgiのリネームについて

    Perl-CGIで ABCという、ディレクトリの中のファイルの名前を、ランダムな名前に変換したいのですがうまくいきません。 これを動作させるたびになぜか、どんどんファイルが減っていってしまいます。 どなたか、教えていただけないでしょうか? 宜しくお願い致します。 #!/usr/local/bin/perl print "Content-Type: text/plain\n\n"; $| = 1; my ($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time); my ($nowtime) = sprintf("%02d_%02d_%02d_%02d_%02d_",$year+1900,$mon+1,$mday,$hour,$min,$sec); #ディレクトリのファイル個数を記録する $dir = "./ABC/"; # ← ディレクトリを変数にセットする opendir DIR, $dir; @files = grep { !m/^(\.|\.\.)$/g } readdir DIR; # ← 「.」 「..」 以外のファイルを取得 close DIR; srand; for (my $i = @files; --$i; ) { my $j = int rand ($i + 1); next if $i == $j; @files[$i, $j] = @files[$j, $i]; } $num = 0; use File::Copy; foreach(@files){ $getpath = "$dir"."$_"; if( copy($getpath, "$dir".$nowtime.$num++.'.dat') eq 1){ $num++; unlink($getpath);}else{print "Copy Error"; exit;} }

    • ベストアンサー
    • CGI
  • 最新のファイルのみ検索

    サーバー内のファイルを検索するのにKentWebさんのwwwsrch.cgiを利用しています。 # # すべてのファイルをなめ回す # sub search1 { local($dir) = $_[0]; local(@filelist, $file, $filename); opendir(DIR, $dir); @filelist = readdir(DIR); closedir(DIR); foreach $file (@filelist) { if ($file eq ".") { next; } if ($file eq "..") { next; } $filename = "$dir/$file"; if (-d $filename) { if ($recursive_flag) { &search1($filename); } } else { &search2($filename, $dir); } } } # # ファイルの中身を検索する # # 指定していない拡張子のファイルは無視する $suffix = ".html .cgi .pl"; $fname = substr($target, rindex($target, ".")); if ($suffix{$fname} != 1) { return; } ↑の条件に30日以上古いファイルを無視するように改造することはできないでしょうか? 検索対象ファイルが数十万以上と莫大に増加してきたため、最新のファイルのみ検索対象にできればと考えております。

    • ベストアンサー
    • Perl
  • PHPでのCGIの読み込みが機能しない原因

    PHPでCGIのデータをHTMLに読み込んでいます。 トップページはちゃんと表示されるのですが、下層ページには何も表示されません。原因が分かる方、解消方法等を教えて頂ければと思います。 CGIソース ※CGIで掲示板の最新投稿を読み込んでいます。 #!/usr/bin/perl require'./bbs.cgi'; my $i = 0; foreach(@logfile){ $viewfile = $_; open (IN,"$viewfile"); local ($xno,$pastpage,$mcount,$msum,$iayear,$iamon) = split(/<>/,<IN>); while(<IN>){ if ($_ =~ /\d*<>m<>\d*<>(\d*)/){ my $num = $1; $data{$num}->{line} = $_; $data{$num}->{dir} = $id[$i]; $data{$num}->{title} = $myid[$i]; push @num, $num; } } $i++; } @num = sort { $b <=> $a } @num; print qq(Content-type: text/html; charset=$CHARSET\n\n); $n=0; foreach(@num){ last if $n >= 5; my $line = $data{$_}->{line}; my $dir = $data{$_}->{dir}; my $title = $data{$_}->{title}; ($ino,$imomy,$ivine,$itime,$iname,$iemail,$iurl,$crypted,$ititle,$imsg,$iaddr,$ihost,$iresize,$ilastres,$ilastday,$iadmark,$isex,$ifrom,$ijoiname,$ijoinwidth,$ijoinheight,$ijoinfilesize,$jayear,$jamon,$irl) = split(/<>/,$line); my $url = $scriptdir . "/" . $dir . "/" . $jayear . "/" . $jamon . "/" . $ivine . ".html"; print qq(<li><a href="$url">$ititle</a></li>); $n++; } exit; ---------------- 以下のPHPをHTMLに記述して上記CGIのデータを読み込んでいます。 <?php $buf = file_get_contents('http://〇〇〇.com/bbs/〇〇.cgi'); echo $buf; ?> ------------- 以上です。 トップページ「'http://〇〇〇.com」上ではきちんと表示されますが、 下層ページ「'http://〇〇〇.com/〇〇〇.html」では空欄になります。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 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
  • PHPページャーの実装方法

    現在使用しているPHPにページャーを付けたいと奮闘しているのですが、小生PHPはまだまだ初心者でうまくいきません。 下は管理画面より生年月日や時間を入力することにより、個人のプロフィール等を表示できる表示画面のPHPなのですが、仮に管理画面より100人分入力すると、表示画面に100人表示されてしまうため、それをページャーにて例えば10人分づつ表示するといったものに出来ればと思っております。 回答される方のためにどのようなことを記載しなければいけないのか等もあまり分からない状態で、下に記載している分で不十分かも知れないのですが、足らない分はご指摘を頂ければ可能な限りコメントにて記載させて頂きますのでどうぞよろしくお願いいたします。 PHP Version 5.2.11 ------------- <?php $fc = 16; mb_http_output("SJIS"); mb_internal_encoding("UTF-8"); ob_start( 'mb_output_handler' ); require_once('../Smarty.class.php'); // create object $smarty = new Smarty; // template, cache, configuration files $smarty->template_dir = '../templates/'; $smarty->compile_dir = '../templates_c/'; $smarty->config_dir = '../configs/'; $smarty->display('i_header1.tpl'); if (file_exists("../1.txt")){ $file_data = file("../1.txt"); } // $arry_cnt = count($file_data)/$fc; $i=0; $j=0; while($i<$arry_cnt){ if (ereg_replace("\n","",$file_data[$i*$fc+15]) == "1"){ $wait_data[$j][rank] = ereg_replace("\n","",$file_data[$i*$fc+0]); $wait_data[$j][s_name] = ereg_replace("\n","",$file_data[$i*$fc+1]); $wait_data[$j][old_years] = ereg_replace("\n","",$file_data[$i*$fc+2]); $wait_data[$j][body_style] = ereg_replace("\n","",$file_data[$i*$fc+3]); $wait_data[$j][work_time] = ereg_replace("\n","",$file_data[$i*$fc+4]); $wait_data[$j][time_wait] = ereg_replace("\n","",$file_data[$i*$fc+5]); $wait_data[$j][comment] = ereg_replace("\n","",$file_data[$i*$fc+6]); $wait_data[$j][pic_path] = ereg_replace("\n","",$file_data[$i*$fc+7]); $wait_data[$j][img_href] = ereg_replace("\n","",$file_data[$i*$fc+8]); $wait_data[$j][name_href] = ereg_replace("\n","",$file_data[$i*$fc+9]); $wait_data[$j][i_href] = ereg_replace("\n","",$file_data[$i*$fc+10]); $diff = ereg_replace("\n","",$file_data[$i*$fc+11]); if (ereg_replace("\n","",$file_data[$i*$fc+11]) > time()) { $diff = ceil($diff - time()); $m_diff = ceil($diff / 60); $h_diff = ceil($diff / (60*60)); $d_diff = ceil($diff / (60*60*24)); if ($m_diff <= 60) { if ($m_diff <= 5) { $wait_data[$j][time_wait] = '5分待ち'; } elseif ($m_diff <= 10) { $wait_data[$j][time_wait] = '10分待ち'; } elseif ($m_diff <= 15) { $wait_data[$j][time_wait] = '15分待ち'; } elseif ($m_diff <= 30) { $wait_data[$j][time_wait] = '30分待ち'; } elseif ($m_diff <= 45) { $wait_data[$j][time_wait] = '45分待ち'; } else { $wait_data[$j][time_wait] = '60分待ち'; } } elseif ($h_diff <= 24) { $wait_data[$j][time_wait] = "".$h_diff . '時間待ち'; } } $j++; } $i++; } function cmp($a, $b) { return strcmp($a["rank"], $b["rank"]); } usort($wait_data, "cmp"); $i=0; while($j>$i){ $smarty->assign("img_href", $wait_data[$i][img_href]); $smarty->assign("pic_path", $wait_data[$i][pic_path]); $smarty->assign("i_href", $wait_data[$i][i_href]); $smarty->assign("name_href", $wait_data[$i][name_href]); $smarty->assign("s_name", $wait_data[$i][s_name]); $smarty->assign("old_years", $wait_data[$i][old_years]); $smarty->assign("body_style", $wait_data[$i][body_style]); $smarty->assign("work_time", $wait_data[$i][work_time]); $smarty->assign("time_wait", $wait_data[$i][time_wait]); $smarty->assign("comment", $wait_data[$i][comment]); $smarty->display('i_wait2.tpl'); $i++; } $smarty->display('i_footer1.tpl'); ?>

    • ベストアンサー
    • PHP
  • phpで困ってます

    下記のphpで、写真をサーバーにアップロードして、2種類にリサイズして保存し、ファイル名をテキストで保存しようとしてるのですが、ファイル名をテキストで保存する部分file_put_contents($name_file,$name_log); にエラーがでます。写真はリサイズされ保存されています。何度か見直しているのですが、原因が分かりません。エラーの原因を教えていただきたいと思い、投稿しました。よろしくお願いします。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>画像ファイルアップロード</title> </head> <body> <?php // 名前保存のテキストファイル $name_file = "name.txt"; // 名前保存のテキストファイル読み込み用の配列 $name_log = array(); // 名前保存のテキストファイルを読み込み用の配列に読み込む if (file_exists($name_file)) { $name_log = file( $name_file ); } // 保存画像の保存先のディレクトリ $dir_l = 'uploads_l/'; // サムネイル画像の保存先のディレクトリ $dir_s = 'uploads_s/'; for ( $i=0; $i<count($_FILES['filename']['tmp_name']); $i++ ) { // ファイル名の取り出し $file_name = $_FILES['filename']['name'][$i]; // ファイル(MIME)タイプの取り出し $file_type = $_FILES['filename']['type'][$i]; // 一時ファイル名の取り出し $temp_name = $_FILES['filename']['tmp_name'][$i]; // 重複しないように日付をヘッダにする $head = date("YmdHis"); // 保存先のファイル名 $upload_name_l = $dir_l . $head ."-". $file_name; // サムネイル画像の保存先のファイル名 $upload_name_s = $dir_s . $head ."-". $file_name; // JPEG形式のファイルをアップロードする if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg')) { // アップロード(移動) $result = move_uploaded_file($temp_name, $upload_name_l); if ($result) { // アップロードの成功 // アップロードされた画像情報を取り出す $image_size = getimagesize($upload_name_l); // アップロードされた画像の幅と高さを取り出す $width = $image_size[0]; $height = $image_size[1]; // 保存画像の幅と高さを決める $width_l = 480; $height_l = round($width_l*$height/$width); // サムネイル画像の幅と高さを決める $width_s = 60; $height_s = round($width_s*$height/$width); // アップロードされた画像を取り出す $image = imagecreatefromjpeg($upload_name_l); // 保存画像の大きさの画像を新規作成 $image_l = imagecreatetruecolor($width_l,$height_l); // アップロードされた画像から保存画像を作成 $result_l = imagecopyresampled( $image_l, $image, 0,0, 0,0, $width_l,$height_l, $width,$height); if ($result_l) { // 保存画像作成成功 // 保存画像の保存 if (imagejpeg($image_l,$upload_name_l)) { echo ' ->保存画像保存';                                      $add_name = $upload_name_l;                array_push($name_log, $add_name); } else { echo ' ->保存画像保存失敗'; } } else { // 保存画像作成失敗 echo ' ->保存画像作成失敗'; } // サムネイルの大きさの画像を新規作成 $image_s = imagecreatetruecolor($width_s,$height_s); // アップロードされた画像からサムネイル画像を作成 $result_s = imagecopyresampled( $image_s, $image, 0,0, 0,0, $width_s,$height_s, $width,$height); if ($result_s) { // サムネイル画像作成成功 // サムネイル画像の保存 if (imagejpeg($image_s,$upload_name_s)) { echo ' ->サムネイル画像保存'; } else { echo ' ->サムネイル画像保存失敗'; } } else { // サムネイル画像作成失敗 echo ' ->サムネイル画像作成失敗'; } // 画像の破棄 imagedestroy($image); imagedestroy($image_l); imagedestroy($image_s); } else { // アップロードの失敗 echo '■アップロード失敗'; } } else { // JPEG形式以外のファイルはアップロードしない echo '■JPEG形式の画像をアップロードしてください。'; } }     //ファイルへ保存 file_put_contents($name_file,$name_log); ?> </body> </html>

    • ベストアンサー
    • PHP
  • Windows漢字フォルダ名の扱い(chdir編)

    先回、次の質問をさせて頂いた者です。http://oshiete1.goo.ne.jp/qa2230450.html 今回、同様な環境にて、chdir()実行しようとすると、 D:\temp ├─フォルダ名の末尾に機能 ├─フォルダ名の末尾に表 ├─途中に機能がある └─途中に表がある スクリプト内では、次のように書いています(サブルーチン部) sub dir_recurs { my $sdir = @_; my ($d,$rc); my $cwd = Cwd::getcwd(); opendir(DIR,$sdir) || die "$cwd/$sdir") . " $! stopped"; my @dirs=(); my @files=(); foreach(sort readdir(DIR)){ if( -d "$_/" ){ next if(/^\.+/); # '.' '..' はパス push(@dirs,"$_"); }elsif( -f "$_" ){ push(@files,$_); # ディレクトリ以外有り }else{ print "ERROR: '$_' in $cwd.\n"; } } closedir(DIR); #----- 下位ディレクトリへ潜る if(@dirs > 0){ foreach $d (@dirs){ if(!chdir("$d/")){ print "ERROR: chdir($d) from $cwd\n"; next; } $rc = &dir_recurs("."); chdir(".."); } } : 前後関係は、はしょりますが、この処理部が走っているときに、 ERROR: 'temp.txt' in D:\temp\フォルダ名の末尾に機・ ERROR: chdir(フォルダ名の末尾に表) from 'D:\temp' ERROR: chdir(途中に機能がある) from 'D:\temp' ERROR: chdir(途中に表がある) from 'D:\temp' のような結果になってしまいます。 一番先頭でのエラーメッセージを見る限りは、 一度は、「D:\temp」の下の「フォルダ名の末尾に機能」ディレクトリに 潜ることを成功しているようなのですが、次回以降に失敗しています。 この症状について、理由等、お分かりの方、よろしくお願いいたします。

  • 実行ファイルの識別方法?

    自分で何度か試したのですが、うまくいきません。ご存知の方ご教授ください。 ディレクトリを指定してその配下にあるファイル全てを実行ファイルか、シンポリックファイルか、普通?のファイルか判断しようとしましたがどうしても実行ファイルの判断処理でコンパイルエラーになります。 (lstatの使い方がちゃんとわかってない?) だいたい以下のような流れです。 ----------------- DIR *dirp; struct dirent *file; /*ここで指定ディレクトリのオープン処理(省略)*/ while((file = readdir(dirp)) != NULL) { char buff[65536]; struct stat buffer; sprintf(buff,"%s%s",dir_name,f->d_name); // 注)dir_nameは指定されたディレクトリ lstat(buff,&buffer); printf( "FILE[%s]\n",f->d_name); if( S_ISLNK( buffer.st_mode) ) { printf("SLINK!\n"); } else if( S_IXUSR(buffer.st_mode) ) { printf("IXUSR\n"); } else { printf("OTHER\n"); } } /*ディレクトリのクローズ処理(省略)*/ ----------------------------------- というような形です。 else if( S_IXUSR(buffer.st_mode) ) { printf("IXUSR\n"); } の文をぬけばコンパイルもとおり、実行もうまくいくのですが、これが入ってしまうとコンパイル自体「呼び出せるのは関数だけです」という??メッセージのエラーがでてしまいうまくとおりません。 どなたかアドバイスをお願いします。

専門家に質問してみよう