如果你有一個文件路徑(例如,/home/bob/test/foo.txt),其中路徑中的每個子目錄可能存在也可能不存在,我怎樣才能以某種方式創建文件foo.txt使用「/home/bob/test/foo.txt」作爲唯一的輸入,而不是在路徑中逐個創建每個不存在的目錄,最後創建foo.txt本身?如何在Perl中創建一個包含所有子目錄的路徑?
回答
您可以使用File::Basename和File::Path
use strict;
use File::Basename;
use File::Path qw/make_path/;
my $file = "/home/bob/test/foo.txt";
my $dir = dirname($file);
make_path($dir);
open my $fh, '>', $file or die "Ouch: $!\n"; # now go do stuff w/file
我沒加任何測試,看看文件已經存在,但是這很容易用Perl補充。
use File::Util;
my($f) = File::Util->new();
$f->make_dir('/var/tmp/tempfiles/foo/bar/');
# optionally specify a creation bitmask to be used in directory creations
$f->make_dir('/var/tmp/tempfiles/foo/bar/',0755);
我不認爲有,可以做所有的你問什麼,直接從文件名的標準功能。
但是來自模塊File :: Path的mkpath()幾乎可以在給定文件名的目錄的情況下完成。從文件::路徑文檔:
的「mkpath」功能提供了一個 便捷的方式來創建目錄, 即使你的「MKDIR」內核調用不會 創建於 目錄的多個級別一次。
請注意,mkpath()不會以很好的方式報告錯誤:由於某種原因,它會死亡而不是返回零。
鑑於這一切,你可以這樣做:
use File::Basename;
use File::Path;
my $fname = "/home/bob/test/foo.txt";
eval {
local $SIG{'__DIE__'}; # ignore user-defined die handlers
mkpath(dirname($fname));
};
my $fh;
if ([email protected]) {
print STDERR "Error creating dir: [email protected]";
} elsif (!open($fh, ">", $fname)) {
print STDERR "Error creating file: $!\n";
}
底層代碼大約有二十年的歷史,編程時尚自那時以來已經發生了很大的變化。您正在使用舊式的File :: Path界面。新的界面可以讓你捕捉所有的錯誤,並在適當的時候處理(或忽略)它們。 – dland 2009-08-25 08:49:39
很高興知道這裏有一個更新的界面。我習慣於編寫適用於舊版本和跨操作系統的可移植Perl(因此,這是兩個參數open()),所以我通常不會通過學習Perl中的新特性來挑逗自己。 :-) – 2009-08-25 09:11:48
@Michael:據我所知,你可能需要編寫舊的Perl出於任何原因,但我不明白爲什麼你會發布這樣的代碼作爲其他例子。如果您知道「open」的三參數形式,請在此處使用它。我們在兩個參數形式的網絡上不需要更多的例子;我們已經綽綽有餘了。 – Telemachus 2009-08-25 10:41:28
- 1. 在子目錄中包含路徑
- 2. 帕格條件包含文件路徑的所有子目錄
- 3. 在makefile中包含路徑以包含子目錄
- 4. 修復所有包含在子目錄中的C++文件中的路徑
- 5. 在一個ftp請求中創建一個包含子目錄的目錄?
- 6. 將包含子目錄的整個目錄添加到路徑
- 7. 在java中的現有路徑中創建一個目錄?
- 8. 如何訪問SVN中不包含子目錄的路徑?
- 9. 在python中,如何獲取目錄中所有文件的路徑,包括子目錄中的文件,但不包括子目錄的路徑
- 10. 在GCC的父目錄中添加一個包含路徑
- 11. 添加包含路徑的特定子目錄以包含
- 12. 如何從Perl中的單個完整路徑創建多個目錄?
- 13. 如何使用PHP包含跨多個目錄/子目錄與相對路徑
- 14. 在一個qt項目中,如何在包含路徑的窗口中添加包含路徑的專業版
- 15. nginx $ document_root包含子目錄在其路徑中插入子目錄
- 16. HDFS是否在請求的路徑上創建所有目錄?
- 17. 如何在命令中包含所有子目錄
- 18. 如何創建一個包含單個文件的目錄?
- 19. Perl:將包含路徑的變量拆分到目錄
- 20. 如何創建一個包含罐子
- 21. CMake包含和源路徑與Windows目錄路徑不一樣
- 22. 如何在asp.net MVC中包含js文件並在所有路徑上都有一個有效路徑
- 23. 如何在Java中創建一個不包含絕對路徑名的Zip/Jar
- 24. Perl - 包含來自相對路徑的包,其中包含來自相對路徑的另一個包?
- 25. Cmake:在包含路徑中構建目錄
- 26. 如何在visual C++中添加目錄以包含路徑?
- 27. 如何在Perl中創建一個目錄內容的數組?
- 28. 包含到子目錄中而不知道要包含的文件的路徑
- 29. 如何創建一個包含文件和目錄的文件?
- 30. 創建一個子目錄中的文件夾中的所有目錄
我想你的意思'mkpath',不'make_path'?否則,很好的答案。 – hobbs 2009-08-25 09:49:36
@Hobbs:查看「File :: Path」的文檔。 'mkpath'被描述爲「遺留」,並且新接口爲該功能使用'make_path'。 – Telemachus 2009-08-25 10:38:04
啊,這是最近的一次變化。我的版本沒有這個界面。 :) – hobbs 2009-08-26 04:32:16