• ベストアンサー

ファイル名の抜き出しについて

いつもお世話になります。 ファイルアップロードし、アップロードしたファイル名を記録するプログラムを 作成しております。(ファイル名を記録し、別プログラムでファイル名にリンクを張ります。) この中でアップロードファイル名がc:\temp\cgi\test.cgiやc:\mydocument\test\temp\cgi\test.cgiと いったものも含め実ファイル名(test.cgi)のみを抜きだして記録したいのですが、上手くいきません。 ファイル名を切り出す方法を教えていただきましたが、こちらも上手くいきませんでした。 $inLink =~ s/^.*[\\\/]//;と記述。 どなたかご教示お願いいたします。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.8

#7>$inLINK =~ s/^.*\\//;を解説していただければ助かります。 #1の方が書いていらっしゃるように、ファイル名以外の部分を取り除きます。 変数 =~ s/パターン/置き換える文字列/; は、変数でパターンにマッチングした部分を"置き換える文字列"で置き換えます。 ^ は、先頭を表すパターンで .* は、一文字の0回以上の繰り返しパターン \\ は、円マーク\ ですが、\ 自体が次のパターン文字をパターンとして認識させないという機能を持つ記号なので、\\のように2つ続けて書く必要があります。 つまり、先頭から、\までを"何もない"と置き換える、即ち取り除くという意味になります。 この場合、.* は、より長くマッチしようとするので、フォルダの階層が深くて \ マークが複数在った場合でも最後の \ マークまで取り除くことができます。

cardy55
質問者

お礼

BLUEPIXY様おはようございます。無理なお願いに対応していただきありがとうございました。おかげさまで理解が進みました。BLUEPIXY様含め今回の件は皆さんに感謝いたします。本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (7)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.7

#5補> >$inLink =~ /(^.*\\)(.*)/; >open(OUT, "> ../upload/$inLINK"); は、ダメです。 >$inLink =~ /(^.*\\)(.*)/; の部分では、s/…/…/をしていませんから、マッチングをさせているだけですから$inLink は置き換えられていません。 マッチングが成功した場合には open(OUT, "> ../upload/$2"); のようにすればいいと思います。 また、$inLink を置き換えた場合には >open(OUT, "> ../upload/$inLINK"); の$inLINK は、"LINK" が大文字になっているため別の変数になっています。同じ変数名を使う必要があります。

cardy55
質問者

補足

BLUEPIXY様:回答が遅れて申し訳ありません。変数名の件お恥ずかしながらミスでした。ご指摘ありがとうございます。冷静な目が必要ですね 。結局下記のようにして動作いたしました。沢山の方々にサポートしていただき助かりました。不勉強で申し訳ありませんが、~ /(^.*\\)*)/;を解説していただければ助かります。 if ($inLINK ne '') { while ($bytesread = read($inLINK, $buffer, $BUFSZ)) { $file .= $buffer; } $inLINK =~ s/^.*\\//; open(OUT, "> ../upload/$inLINK"); binmode(OUT); print(OUT $file); close(OUT); }

全文を見る
すると、全ての回答が全文表示されます。
noname#19175
noname#19175
回答No.6

use strict; を使われることをおすすめします。 Perlでは大文字と小文字を区別しますから。 basenameが使えないのもこれで解消できればいいのですが、、、 私が知ってる各OSのデリミタは UNIX(UNIX like OS) / Windows(DOS) \ (ドライブとパスの区切りに:を使用) Mac Classic : MacOS X / です。 私はデリミタで分割して最後の部分を取り出してましたけどね(^^; Perlの場合は、 if(($pos=rindex($inLink,'/'))>=0){ $inLink = substr($inLink, $pos+1); }elsif(($pos=rindex($inLink,'\\'))>=0){ $inLink = substr($inLink, $pos+1); }elsif(($pos=rindex($inLink,':'))>=0){ $inLink = substr($inLink, $pos+1); } print $inLink; こんな感じで出来たと思いますが、正規表現で不要部分を消しちゃった方がスマートかも(^^; ファイル名の取得方法はどのようにされてますか? <form action="" method="post" enctype="multipart/form-data"> で送信されている場合は、 filename=~ という行が書き出されますが、このときのファイル名は、 ブラウザがデリミタを変更する場合もあるので、クライアントのOSに関係なく、すべてをチェックした方が良いと思います。

cardy55
質問者

補足

taloo様ご回答ありがとうございます。 とりあえずuse strict;を使用してみます。 それから下記部分のご解説をお願いします。 form action="" ~はご指摘の通り記述しております。 「filename=~で書き出される」、「クライアントのOSに関係なく~」の箇所が不勉強で理解できませんでした。 -------------------------------------------------- <form action="" method="post" enctype="multipart/form-data"> で送信されている場合は、 filename=~ という行が書き出されますが、このときのファイル名は、 ブラウザがデリミタを変更する場合もあるので、クライアントのOSに関係なく、すべてをチェックした方が良いと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

#3>basenameが上手く動作していないみたい う~ん、なんでですかね~。 #3がうまくいかないのは、OS間でファイルパスの記述が異なるからかもしれませんけど、 #1,2,4でうまくいかない理由がわからないですね。 本当に、切り出そうとしている $inLink にc:\mydocument\test\temp\cgi\test.cgi のような文字列が入っているんでしょうか?

cardy55
質問者

補足

BLUEPIXY様おはようございます。何度もテストしました。例えばC:\TEMP\CGI\test\upload4\readme.txtファイルを切り出そうと思い下記記述をしてみましたが、上手くいっておりません。ファイルは「C:\TEMP\CGI\test\upload4\readme.txt」でアップロードされファイル名は記録されていません。 $BUFSZ = 2048; $file = ''; $buffer = ''; if ($inLINK ne '') { while ($bytesread = read($inLINK, $buffer, $BUFSZ)) { $file .= $buffer; } $inLink =~ /(^.*\\)(.*)/; open(OUT, "> ../upload/$inLINK"); binmode(OUT); print(OUT $file); close(OUT); } --------------------------------------- ファイル記述は下記の通りです。 seek(DATA, 0, 0); print DATA $tNum."\n"; print DATA @tData; print DATA $tNum."<>".$inTITLE."<>".$inMAIN."<>".$inDATE."<>".$inSEL."<>".$inLink."<>".$inFLAG."<>".$inCATE."\n"; truncate(DATA, tell(DATA)); close(DATA); &unlock; 私では手に負えません。ヒントなどなんでも結構ですので教えて下さい。

全文を見る
すると、全ての回答が全文表示されます。
  • okiyoshi
  • ベストアンサー率34% (11/32)
回答No.4

use strict; my $up_file = 'c:\mydocument\test\temp\cgi\test.cgi'; # としたとき、 my $up_file_name = ( split /[\/\\]/, $up_file )[-1]; print "$up_file_name\n";

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

use File::Spec; $file=q(c:\temp\test.txt); ($volume, $directories, $filename)=File::Spec->splitpath($file); print "$filename\n"; か use File::Basename; $filename = basename($file); print "$filename\n";

cardy55
質問者

補足

BLUEPIXY様ご回答ありがとうございます。テストしてみましたが、ファイル名が入りませんでした。どうやらbasenameが上手く動作していないみたいです。環境の設定などございますでしょうか? プログラムの先頭付近にuse File::Basename;を記述し、 ファイル名を書き込み所で$filename = basename($file);を記述しております。

全文を見る
すると、全ての回答が全文表示されます。
  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.2

#1です。 もうひとつこんなのを。 $inLink =~ /(^.*\\)(.*)/; print "$2\n"; こっちのほうが抜き出してる感じですかね。

全文を見る
すると、全ての回答が全文表示されます。
  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.1

こんなんですかねぇ。 $inLink =~ s/^.*\\//; でもこれだと切り出すというよりは余計な部分を削除してるだけですが。

cardy55
質問者

補足

ttyp03様ご回答ありがとうございます。テストしていた為回答が遅くなりました。色々やってみたのですが、ファイル名が変わりませんでした。c:\mydocument\test\temp\cgi\test.cgi等をアップロードするとそのまま(c:\mydocument\test\temp\cgi\test.cgiという風に)記録されてしまいます。クライアントは(windows多数、MACも多少あり。)サーバーはlinuxです。引き続きサポート願えれば幸いです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PDFファイルアップロード時にOSファイル名の取得のほか任意のファイル名を記録する方法について教えてください。

    先ほどの質問させていただきましたが、もう少し細かいパートで教えてください。 PDFファイルアップロードプログラムでアップロードする際に OS上のファイル名(例:テスト.pdf)の取得その他任意に見出しをつける(例:決算報告)をサーバー上のファイル(管理ファイル)に記録したいのですが、 どのように記述したらよいのでしょうか? またこの管理ファイルを読み込んで、見出しを変更、アップロードファイル削除を行いたいのですが、こちらも記述方法が分かりません。 最後にこの管理ファイルを読み込んで、ダイナミックにページにリンクを張りたいのですが、これも記述方法が分かりません。 プログラムのほか、ロジック(実現方法)だけでもご教示いただければ助かります。どなたかご回答の程お願いいたします。言語はperlです。

    • ベストアンサー
    • Perl
  • ファイル名の切捨てとリンクの張り方

    いつもお世話になります。 ファイルアップロードファイルを下記のように作成しました。 その後の処理でファイル名を記録しようと思ったのですが、 下記のように記述するとファイル名がフルパスになってしまいます。 (ファイル名:.$inLINK.) ファイル名をカットする方法(例:c:\temp\test.txt->test.txt)にするにはどうしたらよいのでしょうか? ファイル拡張子はtxtだけではなく、doc、xls、pdfなど多岐にわたります。 どなたかご教示お願いいたします。 ※できればこの記録したファイルを読込んでリンク表示する方法も教えて下さい。 -----------ファイル記録処理------------------------------------ print DATA $lTMPTabl[0]."<>".$inTITLE."<>".$inMAIN."<>".$inDATE."<>".$inSEL."<>".$inLINK."<>".$inFLAG."<>".$inCATE."\n"; -------------------------------------------------------- ---------ファイルアップロード-------------------------------- $BUFSZ = 2048; $file = ''; $buffer = ''; if ($inLINK ne '') { while ($bytesread = read($inLINK, $buffer, $BUFSZ)) { $file .= $buffer; } open(OUT, "> ../upload/$inLINK"); binmode(OUT); print(OUT $file); close(OUT); } ------------------------------------------------------------

    • ベストアンサー
    • CGI
  • バッチファイル 現在のフォルダ名をファイル名に置き換える

    こんにちは。超初心者なのですが教えてください。 ある複数フォルダに格納されている.txtファイルを、現在の フォルダ名を取得して、別フォルダにリネームして 格納するバッチファイルを作成したいと考えています。 for文を繰り返し使わなければいけないことはわかっているのですが、それをどう表現していいのか全然わかりません。 例えば、 データ取得元として以下のファイルがあったら C:\temp\20100101\data1.txt C:\temp\20100101\data2.txt C:\temp\20100101\data3.txt C:\temp\20100102\data1.txt C:\temp\20100102\data2.txt C:\temp\20100103\data1.txt C:\temp\20100103\data2.txt これを別フォルダに、現在のフォルダ名をファイル名にくっつけて 以下のように一つのフォルダに纏めて格納したいと思っています。 ファイルの中身はそのままコピーしたいので、どこかでcopyコマンド を使うかもしれないです。 C:\test\data1_20100101.txt C:\test\data2_20100101.txt C:\test\data3_20100101.txt C:\test\data1_20100102.txt C:\test\data2_20100102.txt C:\test\data1_20100103.txt C:\test\data2_20100103.txt 実装方法として以下までは考えましたが、これ以上は無理そうです。 rem set A=C:\temp rem set B=C:\test for %%A in (C:\temp\) do ( if not "%%A"=="" ( pushd "%%A" for /d %%B in (*) do ( if not "%%B"=="" ( pushd "%%B" for /d %%C in (*) do ( if not "%%C"=="" ( pushd "%%C" ) ) ) ) popd? ) ) 申し訳ありませんが、お助け願います。

  • ファイル名の取得の方法

    こんにちは アップロードはうまく行ったのですが、ファイル名をうまく取り出すことが出来ません print"$filename \n"; で変数の中身を見るとCODE(0x189015c)というようなものが出てきました。 この変数をファイル名にしなくてはならないのですがどうやってもうまくいきません。 お願いします。 use CGI_Lite; require 'util.pl'; $Title = 'ファイルのアップロード サンプル'; $Temp = './tmp'; $Platform = 'Unix'; $BUFSZ = 2048; $CharSet = 'Shift_JIS'; $upload = new CGI_Lite; $upload->set_directory($Temp) or exitError("ディレクトリ $Temp がオープンできません。"); $upload->set_platform($Platform); $upload->set_buffer_size ($BUFSZ); # ファイル名の変換 $filename = $upload->filter_filename(\&convName); $upload->close_all_files; # フォームデータの解析 %data = $upload->parse_form_data; if ($upload->is_error()) { # アップロードのエラー exitError($upload->get_error_message()); } print <<"EOL"; <HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> $filename </BODY> </HTML> EOL exit(0); sub convName { local($name) = shift; $name =~ tr/A-Z/a-z/; # 大文字から小文字へ変換 $name =~ s/(?:%20)+/_/g; # 空白文字を_に変換 $name =~ s/%[\da-fA-F]{2}//g; # %xx を削除 return ($name); } __END__

    • ベストアンサー
    • CGI
  • PDF管理ファイルを部門ごと分ける方法

    いつもお世話になります。 perlでPDFをアップロードするファイルを作成しております。作成したプログラムはファイルをアップロードした時に管理ファイルを作成しアップロードしたファイル名と任意に作成したファイルを記憶するものです。出力プログラムは別にありその記録ファイルを読み込んでHTMLに吐き出しを行います。仕様変更で各部門ごとに記録ファイルを作成する櫃用があるのですが方法がわかりません。何かよいアイディア、ツールのご紹介をお願いいたします。

  • 条件にあった特定のファイルのフォルダ名を得る

    よろしくお願いします。 階層的に存在するファイル(すべて同名)で、条件にあった記述がされているファイルのフォルダ名を得たいのですが、どのような方法が考えられるでしょうか? 漠然とした質問で申し訳ありません。 例えば、 TEST--+--A--TEST.txt      |      +--B--TEST.txt      |      +--C--TEST.txt というフォルダ階層でフォルダ"/TEST/A~/TEST/C"があり、それぞれ"TEST.txt"というファイルを持っているとします。 その中の"/TEST/B/TEST.txt"だけ"dummy"という記述が1行あったとするとき、フォルダ名"/TEST/B"を抽出したいのですが何か良い方法はあるでしょうか? (実際の各フォルダ名は規則性なくかなりの量があります) サーバー・・・HP-UX CGI開発言語・・・Perl5 開発端末・・・windows2000(Tera Term 使用) 以上、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ブラウザ上でファイルをアップロードさせるCGIでファイル名を指定

    http://www.tohoho-web.com/cgi/wwwupl2.txt ↑このCGIを利用して、ファイルのアップロードが出来るようになったのですが、アップロードされたファイル名をこちらで指定したファイル名に変更させることは出来ますか? 例えば10個のファイルをアップロードした場合、001.jpg、002.jpg、.....010.jpgというように。 アップロードされたファイルをフラッシュで読み込みたいというのが目的です。

    • 締切済み
    • CGI
  • Perlで異なるフォルダからファイルをコピーし、ファイル名を変更する方法を教えてください

    前回類似するお願いをしたのですが、 もう一度ご質問させてください。 <やりたいこと> c:\scriptフォルダにある「copyAndRename.cgi」を  起動し、ファイルコピーとRenameをする処理を  行ないたい。 <ファイルコピーの内容> C:\test1フォルダにあるファイル名「test.test.csv」 を、c:\test2フォルダにコピーする <ファイルRenameの内容> C:\test2フォルダにコピーした、ファイル 名「test.test.csv」の「.」をなくし「-」を置き換え、「test-test-csv」とファイル名に変更する処理をしたい。 <できていること> (1)の処理は行なえているので問題ありません。 (2)の処理に関しては、以前の質問させていただいた  回答から、下記のようなスクリプトを書き、実行した  が、Renameされませんでした。 ----- $A="test.test.csv"; $B=$A; $B=~s/\./-/; # ドットを全置換により[-]に変更。 rename $A,$B; ----- 実行している、「copyAndRename.cgi」が格納されている c:\svriptフォルダに、「test.test.csv」をおいて テストをしてみると正常に起動します。 renameを行なう際のパスの切り方がわかれば 解決できると思うのですが、わかりません。 初心者の質問で恐縮ですが、どなたかお教えください。

    • ベストアンサー
    • CGI
  • ファイル内容抜き出しに付いて教えてください。

    お世話になっております。 solarisでシェルを作成したいのですが。 ある文だけを抜き出したいと思っています。 例: ファイル名:test.txt 1############## 2# test test # 3############## 4aaaaaaabbbbbbb ←このファイル内の4行目と5行目だけを他のファイルにコピーしたい 5cccccccddddddd 4行目と5行目だけを他のファイルにコピーしたいのですが可能でしょうか? ご教授願います。

  • curlでFTP転送時、日本語ファイル名が文字化け

    linux上でcurlコマンドを使用し日本語ファイル名をFTP転送した場合、 文字化けしてしまいます。何か解決策はありますでしょうか。 下記の記事(Windows環境の場合)ではcurlでは日本語ファイル名が転送できない旨の記述がありました。 解決策としてA案、B 案の記述がありますが意味がよくわからないです。A案はテンポラリフォルダにファイルをコピーしてそれをアップロードするようなことが書いてありますがなぜそれで解決するのでしょうか。日本語ファイル名のファイルをテンポラリフォルダにコピーしてそれをアップロードしても結果は同じで文字化けすると思います。 また、B案は日本語ファイル名「日本語.csv」があった場合、シンボリックリンク(ショートカット)を「test.csv」の名前で作成。「test.csv」をアップロードするということでしょうか?ショートカットがアップロードされるだけのような気がするのですが違いますでしょうか。 https://golorih.exblog.jp/26695040/