Я отправляю переменную в PHP-процесс, пытаясь найти файл в каталоге.
Проблема в том, что имя файла намного длиннее, чем пользователь будет отправлять. Они отправят только номер рейса, который выглядит следующим образом:
222INE
Если имя файла будет выглядеть так:
CMDU-YMUNICORN-222INE-23082016.txt
Поэтому мне нужно, чтобы PHP мог заглянуть в каталог, найти файл с соответствующим номером рейса и подтвердить его существование (мне действительно нужно иметь возможность загружать указанный файл, но это будет для другого вопроса, если я не может понять это).
В любом случае, вот PHP-процесс, который принимает опубликованную переменную:
<?php if($_POST['voyage'] == true) { $voyage = mysqli_real_escape_string($dbc, $_POST['voyage']); $files = glob("backup/................."); // <-this is where the voyage will go // it should look like this // $files = glob("backup/xxxx-xxxxxxxx-222INE-xxxx.txt"); if(count($files) > 0) { foreach($files as $file) { $info = pathinfo($file); echo "File found: " . $info["name"]; } } else { echo "File doesn't exist"; } } ?>
Имя файла всегда будет начинаться с CMDU. Вторая часть может отличаться. Затем номер рейса. Дата, за которой следует txt.
Я надеюсь, что в этом есть смысл.
Если вы можете помочь, я был бы признателен.
Итак, во-первых, вы должны сделать список каталогов
<?php if($_POST['voyage'] == true) { $voyage = $_POST['voyage']; //in this case is not important to escape $files = scandir("backup"); // <-this is where the voyage will go ***HERE YOU USE DIR LISTING*** unset($files[0], $files[1]) // remove ".." and "."; if(count($files) > 0) { $fileFound = false; foreach($files as $file) { if((preg_match("/$voyage/", $file) === 1)){ echo "File found: $file \n"; $fileFound = true; } } if(!$fileFound) die("File $voyage doesn't exist"); // after loop ends, if no file print "no File" } else { echo "No files in backup folder"; //if count === 0 means no files in folder } } ?>
Вы можете использовать функцию scandir
.
Он вернет массив файлов внутри каталога.
Итак, вы можете сделать что-то вроде этого:
$dir = "backup/"; $files = scandir( $dir ); $myFile = null; foreach( $files as $each ) { if(preg_match(/*some magic here*/, $each)) { $myFile = $dir . $each; } return $myFile;
Я знаю, что этот код может иметь некоторые ошибки, но я бы попробовал что-то вроде этого.
Я бы использовал функцию scandir, чтобы получить список файлов в каталоге резервного копирования и отфильтровать его до соответствующего файла.
$voyageFiles = array_filter( scandir( "backup" ), function($var) use ($voyage) { // expand this regexp as needed. return preg_match("/$voyage/", $var ); } ) $voyageFile = array_pop( $voyageFiles );
ваш шаблон реестра:
$voyage = $_POST['voyage']; $pattern = '/^CMDU-.*-'.$voyage.'-.*\.txt/';
вы можете использовать переменную $pattern
в функции preg_match