在PHP中创建一个尚不存在的文件夹内的文件

27

我希望我的php脚本能够根据日期在文件夹中创建一个输出文件。我这样做的方式是从另一个程序输出的文本文件中获取文件夹名称/文件名,但我无法编辑该文件。

所以它所抓取数据的文件看起来像这样:

data/newfolder/10302008/log_for_Today.txt | 24234234

只有多行时,我只需要脚本逐行遍历,获取文件夹/文件名并在该位置创建一个空文件。

所有目录都是777。现在我知道如何在文件夹中创建一个新的空exe文件,但似乎无法弄清楚如何先创建文件夹,然后在其中创建exe,有什么想法吗?

5个回答

81
if(!file_exists(dirname($file)))
    mkdir(dirname($file), 0777, true);
//do stuff with $file.

使用 mkdir() 的第三个参数可以让它递归地创建目录。


3
我也不是。Recursive 显然是在 5 版本中添加的。太酷了! - da5id

4

With

$directories = explode( '/', $path );

您可以拆分路径以获取单个目录名称。然后遍历数组并创建目录设置chmod 777。(执行php的系统用户必须具备此能力。)
$file = array_pop( $directories );
$base = '/my/base/dir';

foreach( $directories as $dir )
{

   $path = sprintf( '%s/%s', $base, $dir )
   mkdir( $path ); 
   chmod( $path, 777 );
   $base = $path;

}

// file_put_contents or something similar
file_put_contents( sprintf( '%s/%s', $base, $file ), $data );

这里的问题在于你可能无法从你的php脚本中设置chmod。 另一种选择是使用FTP。用户将FTP登录数据传递给脚本,它使用FTP功能来管理文件。 http://www.php.net/FTP

对于 777 给予了差评。 - Robo Robok

3

虽然有点晚,但我发现了这个问题,并且我有一个解决方案。以下是一个示例代码,它适用于任何深度的文件夹,无论您的文件夹有多深。如果您在Windows服务器上运行它,请更改第1行和第3行的目录分隔符。

$pathToFile = 'test1/test2/test3/test4/test.txt';
$fileName = basename($pathToFile);
$folders = explode('/', str_replace('/' . $fileName, '', $pathToFile));

$currentFolder = '';
foreach ($folders as $folder) {
    $currentFolder .= $folder . DIRECTORY_SEPARATOR;
    if (!file_exists($currentFolder)) {
        mkdir($currentFolder, 0755);
    }
}
file_put_contents($pathToFile, 'test');

最好的问候,乔治!


这个解决方案与RecursiveDirectoryIterator结合使用时非常有效,因为文件名的基本输出恰好是一个包含完整路径和文件本身的字符串。这个解决方案很好地解压了所有内容。在我的情况下,我正在编写一个脚本,它获取一个静态站点缓存,该缓存实际上保存为序列化对象,从数组中提取HTML内容,然后将其保存为另一个基本位置的文件。从而让我从缓存中创建站点的静态版本,而无需爬行站点来镜像它。效果非常好! - Carnix

1
使用mkdir()创建任何缺失的文件夹,然后使用touch()创建空文件。
在这两种情况下,您都可以使用绝对路径,意思是:
mkdir('data');
mkdir('data/newfolder');
mkdir('data/newfolder/10302008');
touch('data/newfolder/10302008/log_for_Today.txt');
如果你想知道程序的起始点在哪里,你可以使用getcwd()函数来获取当前工作目录。

3
因为可以使用递归的 mkdir() 更加简单地完成此操作,所以此回答被负评。请参考 gnud 的回答。 - siliconrockstar

0

我最担心的是它一次性获取文件和目录,我不确定如何轻松地将它们分开。 - Mat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接