Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP如何将8500个文件划分到文件夹中_Php - Fatal编程技术网

PHP如何将8500个文件划分到文件夹中

PHP如何将8500个文件划分到文件夹中,php,Php,我有大约8500个PDF文件存储在我的服务器上。 我想将它们像这样划分到子文件夹中: 0-100>文件夹1 101-200>文件夹2 201-300>文件夹3 ... 1001-1100>文件夹11 1101-1200>文件夹12 1201-1300>文件夹13 ... 我知道如何创建新目录并在文件夹之间移动文件。但是,检测将它们放入哪个文件夹的最佳方法是什么。第二,如何使用正确的if函数查看它们是否存在于某个文件夹中 您可以将所有文件读入一个大数组,然后使用array\u chunk进行拆分

我有大约8500个PDF文件存储在我的服务器上。 我想将它们像这样划分到子文件夹中:

0-100>文件夹1 101-200>文件夹2 201-300>文件夹3 ... 1001-1100>文件夹11 1101-1200>文件夹12 1201-1300>文件夹13 ... 我知道如何创建新目录并在文件夹之间移动文件。但是,检测将它们放入哪个文件夹的最佳方法是什么。第二,如何使用正确的if函数查看它们是否存在于某个文件夹中


您可以将所有文件读入一个大数组,然后使用array\u chunk进行拆分

$arr = []; // assume all your filename to be in here
$chunked = array_chunk($arr, 100);
然后,chunked将是一个包含85个数组的新数组,其中85个内部数组中的每个都包含100个文件名

Andreas补充道,以显示我认为这种方法的真正潜力

$arr = range(1,1000); // as temporary substitute for glob()
$chunked = array_chunk($arr, 100);
//Var_dump($chunked);

Foreach($chunked as $key => $subarr){
    $destfolder = "/folder " . ($key+1) . "/";
    Foreach($subarr as $file){
        // Move $file to $destfolder.
    }
}
这意味着您不必计算文件将进入哪个文件夹。 因为数组从0开始,所以它总是$key+1。 目标文件夹字符串只需要创建85次,而其他方法则需要创建8500次


如果您不喜欢或同意此LAR,请随意删除。

您可以将所有文件读取到一个大数组中,然后使用数组块进行拆分

$arr = []; // assume all your filename to be in here
$chunked = array_chunk($arr, 100);
然后,chunked将是一个包含85个数组的新数组,其中85个内部数组中的每个都包含100个文件名

Andreas补充道,以显示我认为这种方法的真正潜力

$arr = range(1,1000); // as temporary substitute for glob()
$chunked = array_chunk($arr, 100);
//Var_dump($chunked);

Foreach($chunked as $key => $subarr){
    $destfolder = "/folder " . ($key+1) . "/";
    Foreach($subarr as $file){
        // Move $file to $destfolder.
    }
}
这意味着您不必计算文件将进入哪个文件夹。 因为数组从0开始,所以它总是$key+1。 目标文件夹字符串只需要创建85次,而其他方法则需要创建8500次


如果您不喜欢或不同意,请随时删除此LAR。

类似的内容可能无法测试

<?php
$listOfFiles = ["100.pdf", "200.pdf", "201.pdf"]; // populate this using glob / opendir

foreach ($listOfFiles as $file) {

    // intval will return just the number part of the filename
    // division with 100 + ceil will make 100 = 1, 200 = 2, 201 = 3 aso
    $folderName = ceil(intval($file) / 100);

    // make folder
    if (!file_exists($folderName)) {
        mkdir($folderName, 0755, true);
    }

    // move file if does not exists
    if (!file_exists($foldername."/".$file)) {
        rename($file, $foldername."/".$file);
    } else {
        // maybe delete it
        unlink($file);
    }

}

像这样的东西可能不需要测试就可以工作

<?php
$listOfFiles = ["100.pdf", "200.pdf", "201.pdf"]; // populate this using glob / opendir

foreach ($listOfFiles as $file) {

    // intval will return just the number part of the filename
    // division with 100 + ceil will make 100 = 1, 200 = 2, 201 = 3 aso
    $folderName = ceil(intval($file) / 100);

    // make folder
    if (!file_exists($folderName)) {
        mkdir($folderName, 0755, true);
    }

    // move file if does not exists
    if (!file_exists($foldername."/".$file)) {
        rename($file, $foldername."/".$file);
    } else {
        // maybe delete it
        unlink($file);
    }

}

这不是经过测试的代码,但是所有的逻辑都在那里,可以满足您的需要。如果需要移动文件而不是复制,请使用重命名功能

您可能还需要修改getDir函数以返回新目录的绝对路径

<?php
$files = [ 
  '/foo/35.pdf', 
  '/bar/135.pdf', 
  '/foo/235.pdf', 
  '/baz/1035.pdf', 
  '/foo/1135.pdf', 
  '/bar/1235.pdf'
];

foreach ($files as $file) {
  // Get the base name of the file.
  $basename = basename($file);

  // Get the directory the file should go into.
  $dir = getDir($basename);

  // Make the directory if it doesn't exist.
  if (!file_exists($dir)) {
    mkdir($dir);
  }

  // Create a string with the new path
  $path = $dir.'/'.$file;

  // Copy the file if it doesn't exists already
  if (!file_exists($newpath) {
    copy($file, $newpath);
  }
}

function getDir($file) {
  $num = (int)strstr($file, '.', true);
  return floor($num / 100)+1;
}

:编辑:正如Andreas指出的,这将把100放在目录2中,因为这个解决方案将0-99分组,而不是1-100。如果基于1的目录是一个硬性要求,Lawrence的答案是一个很好的参考。

这不是经过测试的代码,但所有的逻辑都可以满足您的需要。如果需要移动文件而不是复制,请使用重命名功能

您可能还需要修改getDir函数以返回新目录的绝对路径

<?php
$files = [ 
  '/foo/35.pdf', 
  '/bar/135.pdf', 
  '/foo/235.pdf', 
  '/baz/1035.pdf', 
  '/foo/1135.pdf', 
  '/bar/1235.pdf'
];

foreach ($files as $file) {
  // Get the base name of the file.
  $basename = basename($file);

  // Get the directory the file should go into.
  $dir = getDir($basename);

  // Make the directory if it doesn't exist.
  if (!file_exists($dir)) {
    mkdir($dir);
  }

  // Create a string with the new path
  $path = $dir.'/'.$file;

  // Copy the file if it doesn't exists already
  if (!file_exists($newpath) {
    copy($file, $newpath);
  }
}

function getDir($file) {
  $num = (int)strstr($file, '.', true);
  return floor($num / 100)+1;
}

:编辑:正如Andreas指出的,这将把100放在目录2中,因为这个解决方案将0-99分组,而不是1-100。如果基于1的目录是一个硬要求,劳伦斯的答案是一个很好的参考。

如果0-100是文件夹1,那么1001-1100怎么可能是文件夹10?哪个文件夹应该有200个文件?如果要创建一个包含$fileCounter和$dirCounter的循环,每次运行100个文件,并且如果文件名=循环的$fileCounter计数,则将其移动到当前$dirCounter的计数目录中,该怎么办?当然,每100个循环增加$dirCounter。我不明白你为什么需要这个代码。据我所知,这是一个一次性使用的代码。一旦文件被移动,代码就没有用处了。如果只使用一次代码,则必须使其比手动执行更高效。一个很好的猜测是,手工完成这项工作大约需要20-30分钟。你发帖已经20分钟了。您现在可以完成了。@Andreas 30分钟手动移动8500个文件?我会雇用你的=D不过,说真的,编写代码所需的时间更少,而且消除了人为错误的因素。如果您决定更改目录结构,还可以重新运行或轻松重构。此外,这毕竟是一个与编程相关的问题。是的,但移动文件仍然是一项快速的工作。这让人望而生畏,但相当快。一旦你搬了几百个房间,你就会进入禅宗状态,你就知道该按什么按钮了。我相信我们已经证明,在发布这个问题时,编写代码需要30分钟以上,OP应该先自己做一些尝试和研究如果0-100是文件夹1,那么1001-1100怎么可能是文件夹10?哪个文件夹应该有200个文件?如果要创建一个包含$fileCounter和$dirCounter的循环,每次运行100个文件,并且如果文件名=循环的$fileCounter计数,则将其移动到当前$dirCounter的计数目录中,该怎么办?当然,每100个循环增加$dirCounter。我不明白你为什么需要这个代码。据我所知,这是一个一次性使用的代码。一旦文件被移动,代码就没有用处了。如果只使用一次代码,则必须使其比手动执行更高效。一个很好的猜测是,手工完成这项工作大约需要20-30分钟。你发帖已经20分钟了。您现在可能已经完成了。@Andreas需要30分钟手动移动8500文件

s我会雇用你的=D不过,说真的,编写代码所需的时间更少,而且消除了人为错误的因素。如果您决定更改目录结构,还可以重新运行或轻松重构。此外,这毕竟是一个与编程相关的问题。是的,但移动文件仍然是一项快速的工作。这让人望而生畏,但相当快。一旦你搬了几百个房间,你就会进入禅宗状态,你就知道该按什么按钮了。我相信我们已经证明,当这个问题发布时,需要30分钟以上的时间来编写代码,OP应该先自己做一些尝试和研究。这个问题如何回答OP的问题?他问的是如何移动文件并验证它们,而不是如何创建文件数组。@Adam在某种程度上回答了OP。它将文件分成100个块。但我不确定使用此方法时,问题图像中的文件113会发生什么情况。该方法已记录在案,最后一个数组将包含$size参数以下的剩余项@亚当:你错了。他写道我知道如何创建文件夹和移动文件。。。所以这不是问题。@Lars你介意我给你的答案加上一些代码吗?我认为你的代码片段比你在这里展示的更有价值。这个如何回答OP的问题?他问的是如何移动文件并验证它们,而不是如何创建文件数组。@Adam在某种程度上回答了OP。它将文件分成100个块。但我不确定使用此方法时,问题图像中的文件113会发生什么情况。该方法已记录在案,最后一个数组将包含$size参数以下的剩余项@亚当:你错了。他写道我知道如何创建文件夹和移动文件。。。所以这不是问题。@Lars你介意我给你的答案加上一些代码吗?我认为您的代码片段比您在此处显示的内容提供了更多的功能。这似乎是一个潜在的开始,但仍然需要验证OP的文件是否存在于给定的目录中。这似乎是一个潜在的开始,但仍然需要验证OP的文件是否存在于给定的目录中。您的数学计算有点错误。如果文件名为100,则函数返回文件夹2,而不是OP要求的文件夹1。@Andreas很好,我将添加一条免责声明。这个和其他答案应该能让他继续。为什么不直接使用ceil$num/100呢?你不觉得很有趣吗?你想通过创建一个代码来消除人为错误,然后你的代码将85个文件放在错误的文件夹中?@Andreas我想你没有更好的办法了。读第一句话。我在帮那家伙打棒球。到目前为止,你提出的手动操作的建议是这里最大的笑话。你的数学有点不对劲。如果文件名为100,则函数返回文件夹2,而不是OP要求的文件夹1。@Andreas很好,我将添加一条免责声明。这个和其他答案应该能让他继续。为什么不直接使用ceil$num/100呢?你不觉得很有趣吗?你想通过创建一个代码来消除人为错误,然后你的代码将85个文件放在错误的文件夹中?@Andreas我想你没有更好的办法了。读第一句话。我在帮那家伙打棒球。到目前为止,你提出的手动操作的建议是这里最大的笑话。