Jump to content
  • 0

Помогите плиз со SCANDIR'ом


quake3
 Share

Question

Здравстуйте.

Есть вопрос небольшой. Начну с описания того, что нужно. В каждом из 50 каталогов лежит по 1 word-овскому фалу. Файлы обновляются в директориях раз в неделю (имена соответственно новые). С помощью scanir'а думаю читать директорию, далее заносить имя файла в переменную и в ссылку на файл подставлять эту .../переменную.doc Помогите плиз правильно составить скрипт с использованием scandir. Спасибо заранее.

Кое-какие наброски есть, но в целом не получается:

$path = '/files/.......'; //  путь 

$folder = $path . $folder;

$file_name = array(); // создаем будущий массив с ссылками
$folder = array('folder1','folder2','folder3'); // папки
for($i = 0, $c = sizeof($folder); $i < $c; $i++) {
// открываем папку
if($dir = opendir($folder)) {
// Смотрим содержимое
while(false !== ($file = readdir($dir))) {
// узнаем тип файла и имя
$name_arr = explode(".", $file);
$type = end($name_arr);

// выбираем только word документы
if($type == 'doc' || $type == 'docx') {
$file_name[] = $file;
}
}
}
closedir($dir); //Закрываем директорию
}
print_r($file_name); // смотрим какие есть файлы

Ссылки на открытие файлов идут в виде jump menu:

<form name="form7" id="form7">
<select name="jumpMenu7" id="jumpMenu7">
<option value="papka1/1740.doc">Имя ссылки 1</option>
<option value="papka2/1753.doc">Имя ссылки 2</option>
<option value="papka3/1738.doc">Имя ссылки 3</option>
<option value="papka4/1690.doc">Имя ссылки 4</option>
</select>
<input type="button" name="go_button7" id= "go_button7" value="Выбрать" onClick="MM_jumpMenuGo('jumpMenu7','self',0)">
</form>

И нужно ,чтобы вместо указания конкретного WORD-файла в ссылке была переменная, т.е. чтобы не править ссылки каждый раз когда поменяется WORD-файл.

Вот тут структура каталогов и в index.php все описано.

Скачать kornevaya_papka.rar

Буду очень благодарен за помощь.

Link to comment
Share on other sites

23 answers to this question

Recommended Posts

  • 0

В коде у Вас, много ошибок.

		if ( $dir = opendir( 'folder' ) )
{
while ( false !== ( $file = readdir( $dir ) ) )
{
if ( $file != '.' && $file != '..' && $file != ".htaccess" && $file != "index.html" )
{
$file_ext = substr ($file, (strlen($file)-3), 3);
}
if ( $file_ext == 'doc' ||$file_ext == 'docx' ) print 'Это ворд файл, делай со мной что хочешь!';
}
}

Edited by AMD
Link to comment
Share on other sites

  • 0
В коде у Вас, много ошибок.

Спасибо большое AMD. Вот в таком виде я получил имя файла с расширением -

<?php   
if ( $dir = opendir('C:/server/htdocs/docs/reg/Kaluga') )
{
while ( false !== ( $file = readdir( $dir ) ) )
{
if ( $file != '.' && $file != '..' && $file != ".htaccess" && $file != "index.html" )
{
$file_ext = substr ($file, (strlen($file)-3), 3);
}
if ( $file_ext == 'doc' ||$file_ext == 'docx' ) print $file;
}
}
?>

И как я понял, мне теперь нужно будет для всех моих каталогов (их 83) прописать этот код, но с уникальной переменной (в коде выше это $file) ?? Или есть какая-нибудь автоматизация ? Структура такова: 7 каталогов (выше это reg), в них 83 каталога (выше это kaluga) и соответственно 83 Word-файла.

Edited by quake3
Link to comment
Share on other sites

  • 0

если есть вложеность каталогов, можно заюзать

if ( is_dir($file) ) print 'Опять открывает каталог.. читаем... и т.д.';

Тогда советую написать функцию.

#Запускаем функцию начиная с главного каталога.
function catalog_read($path)
{
if ( $dir = opendir($path) )
{
while ( false !== ( $file = readdir( $dir ) ) )
{
if ( $file != '.' && $file != '..' && $file != ".htaccess" && $file != "index.html" )
{
if ( is_dir($file)) catalog_read($file);
$file_ext = substr ($file, (strlen($file)-3), 3);
}
if ( $file_ext == 'doc' ||$file_ext == 'docx' ) print $file;
}
}
}

Что то вроде этого, сделаете как Вам нужно.

И еще скрипт будет выполнятся слишком долго.

Советую поставить в начало:

#Отключаем время выполнение скрипта.
set_time_limit(0);
#Продолжить выполнение в случае разрыва соединения от клиента/сервера.
ignore_user_abort();

Link to comment
Share on other sites

  • 0

И еще вопрос. Почему при выводе ссылки значение переменной, хранящей имя файла, не подставляется в ссылку ?

Ссылка:

<a href="reg/Kostrom/'<?php echo $Kostrom; ?>'" target="_self">Кострома - Word</a>

При нажатии на ссылку браузер выдает

Index of /site/reg/Kostrom

Name Last modified Size Description Parent Directory -

722.doc 26-Oct-2009 17:38 1.3M

Edited by quake3
Link to comment
Share on other sites

  • 0
$file_ext = substr ($file, (strlen($file)-3), 3);

Здесь неточность. Вы проверяете $file_ext на doc и docx, но вышеуказанный код для docx возвратит ocx.

Внесу свою скромную лепту:

		/**
* Директория, для поиска файлов. Поиск будет также производиться
* во всех её поддиректориях.
* В данном случае она указывается относительно корня сайта
*/
$docsDirectory = 'docs';

//Расширения файлов, которые нам необходимы
$needleExtensions = array('doc', 'docx');

//Массив найденных файлов
$foundedFiles = array();

try {
$directoryIterator = new RecursiveDirectoryIterator($docsDirectory, RecursiveDirectoryIterator::KEY_AS_PATHNAME);
} catch(Exception $e){
echo $e->getMessage();
exit;
}

$dirs = new RecursiveIteratorIterator($directoryIterator, RecursiveIteratorIterator::SELF_FIRST);

foreach ($dirs as $dir => $fileInfo) {
if (true === $fileInfo->isFile() && in_array(strtolower(pathinfo(($filePath = $fileInfo->getPathname()), PATHINFO_EXTENSION)), $needleExtensions)) {
/**
* Индексируем массив именем файла
* В случае ОС windows заменяем "\" на "/" в пути файла
*/
$foundedFiles[$fileInfo->getBasename()] = str_replace('\\', '/', $filePath);
}
}

$output = '';
if (false === empty($foundedFiles)) {
/**
* Прокручиваем массив, создавая ссылки на файлы, где имя
* ссылки идентично имени файла
*/
foreach ($foundedFiles as $fileName => $filePath) {
$output .= '<a href="' . $filePath . '">' . $fileName . '</a><br/>';
}
}

echo $output;

p.s. В случае, если вы указываете абсолютный путь до файлов, то с корректировкой ссылки на файл думаю справитесь?

p.p.s. Извиняюсь, поспешил, индексация $foundedFiles именем файла не совсем верный вариант, т.к. в случае одинаковых имён, пути будут затираться.

Но у вас есть своя голова, допилите, что необходимо. :)

Link to comment
Share on other sites

  • 0
Переменная скорее всего пуста.

Проверяйте.

die($Kostrom);

Переменная вроде не пуста, т.к. при выполнении этого кода (даже при замене файла в директории) имя выводилось верное.

<?php  
if ( $dir = opendir('C:/server/htdocs/docs/reg/Kaluga') )
{
while ( false !== ( $file = readdir( $dir ) ) )
{
if ( $file != '.' && $file != '..' && $file != ".htaccess" && $file != "index.html" )
{
$file_ext = substr ($file, (strlen($file)-3), 3);
}
if ( $file_ext == 'doc' ||$file_ext == 'docx' ) print $file;
}
}
?>

Link to comment
Share on other sites

  • 0
Здесь неточность. Вы проверяете $file_ext на doc и docx, но вышеуказанный код для docx возвратит ocx.

Внесу свою скромную лепту:

		/**
* Директория, для поиска файлов. Поиск будет также производиться
* во всех её поддиректориях.
* В данном случае она указывается относительно корня сайта
*/
$docsDirectory = 'docs';

//Расширения файлов, которые нам необходимы
$needleExtensions = array('doc', 'docx');

//Массив найденных файлов
$foundedFiles = array();

try {
$directoryIterator = new RecursiveDirectoryIterator($docsDirectory, RecursiveDirectoryIterator::KEY_AS_PATHNAME);
} catch(Exception $e){
echo $e->getMessage();
exit;
}

$dirs = new RecursiveIteratorIterator($directoryIterator, RecursiveIteratorIterator::SELF_FIRST);

foreach ($dirs as $dir => $fileInfo) {
if (true === $fileInfo->isFile() && in_array(strtolower(pathinfo(($filePath = $fileInfo->getPathname()), PATHINFO_EXTENSION)), $needleExtensions)) {
/**
* Индексируем массив именем файла
* В случае ОС windows заменяем "\" на "/" в пути файла
*/
$foundedFiles[$fileInfo->getBasename()] = str_replace('\\', '/', $filePath);
}
}

$output = '';
if (false === empty($foundedFiles)) {
/**
* Прокручиваем массив, создавая ссылки на файлы, где имя
* ссылки идентично имени файла
*/
foreach ($foundedFiles as $fileName => $filePath) {
$output .= '<a href="' . $filePath . '">' . $fileName . '</a><br/>';
}
}

echo $output;

p.s. В случае, если вы указываете абсолютный путь до файлов, то с корректировкой ссылки на файл думаю справитесь?

p.p.s. Извиняюсь, поспешил, индексация $foundedFiles именем файла не совсем верный вариант, т.к. в случае одинаковых имён, пути будут затираться.

Но у вас есть своя голова, допилите, что необходимо. :)

Вы уж простите меня...я начинающий. Поэтому в этом коде много чего не понимаю. Если можно как-нибудь это привязать к конкретным вещам (kornevaya_papka), то разобраться было бы легче и я был бы очень признателен.

Link to comment
Share on other sites

  • 0

Привязано к конкретному примеру. Дальше сами.

function normalizePath($path) {
return rtrim(str_replace(array('/', '\\'), '/', $path), '/');
}

$documentRoot = normalizePath(getenv('DOCUMENT_ROOT'));

$foundedFiles = array();
$docsDirectory = dirname(normalizePath(__FILE__));
$needleExtensions = array('doc', 'docx');

try {
$directoryIterator = new RecursiveDirectoryIterator($docsDirectory, RecursiveDirectoryIterator::KEY_AS_PATHNAME);
} catch(Exception $e){
echo $e->getMessage();
exit;
}

$dirs = new RecursiveIteratorIterator($directoryIterator, RecursiveIteratorIterator::SELF_FIRST);

foreach ($dirs as $dir => $fileInfo) {
if (true === $fileInfo->isFile() && in_array(strtolower(pathinfo(($filePath = $fileInfo->getPathname()), PATHINFO_EXTENSION)), $needleExtensions)) {
$foundedFiles[str_replace($documentRoot, '', normalizePath($filePath))] = $fileInfo->getBasename();
}
}

$output = '';
if (false === empty($foundedFiles)) {
foreach ($foundedFiles as $filePath => $fileName) {
$output .= '<a href="' . $filePath . '">' . $fileName . '</a><br/>';
}
}

echo $output;

Link to comment
Share on other sites

  • 0

В итоге работы кода (добавлена переменная $path - путь к корневой папке, где разложены ворд-файлы)

<?php
$path = "C:\server\htdocs\iamdoc";
function normalizePath($path) {
return rtrim(str_replace(array('/', '\\'), '/', $path), '/');
}

$documentRoot = normalizePath(getenv('DOCUMENT_ROOT'));

$foundedFiles = array();
$docsDirectory = dirname(normalizePath(__FILE__));
$needleExtensions = array('doc', 'docx');

try {
$directoryIterator = new RecursiveDirectoryIterator($docsDirectory, RecursiveDirectoryIterator::KEY_AS_PATHNAME);
} catch(Exception $e){
echo $e->getMessage();
exit;
}

$dirs = new RecursiveIteratorIterator($directoryIterator, RecursiveIteratorIterator::SELF_FIRST);

foreach ($dirs as $dir => $fileInfo) {
if (true === $fileInfo->isFile() && in_array(strtolower(pathinfo(($filePath = $fileInfo->getPathname()), PATHINFO_EXTENSION)), $needleExtensions)) {
$foundedFiles[str_replace($documentRoot, '', normalizePath($filePath))] = $fileInfo->getBasename();
}
}

$output = '';
if (false === empty($foundedFiles)) {
foreach ($foundedFiles as $filePath => $fileName) {
$output .= '<a href="' . $filePath . '">' . $fileName . '</a><br/>';
}
}

echo $output;
?>

выводится список всех word-файлов в виде списка ссылок на них..открывают правильно.

Вопрос:

<form name="form" id="form">
<select name="jumpMenu" id="jumpMenu">
<option value="http://localhost/iamdoc/_car/Bel/29-1669.doc">Открыть 1 файл</option>
<option value="http://localhost/iamdoc/_car/Bry/29-1721.doc">Открыть 2 файл</option>
</select>
<input type="button" name="go_button" id= "go_button" value="Go" onclick="MM_jumpMenuGo('jumpMenu','parent',0)" />
</form>

Как мне вытащить из $output (или откуда-нибудь еще) переменные для того чтобы подставлять вместо конкретных имен файлов в jump menu (29-1669.doc) ?

Ведь файлы обновляются (с новыми именами) раз в неделю.. и нереально каждый раз править все имена файлов в ссылках.

Link to comment
Share on other sites

  • 0

За вас уже все сделали, неужели трудно догадаться?

$output .= '<option value="' . $filePath . '">' . $fileName . '</option>';


<form name="form" id="form">
<select name="jumpMenu" id="jumpMenu">
echo $output;
</select>
<input type="button" name="go_button" id= "go_button" value="Go" onclick="MM_jumpMenuGo('jumpMenu','parent',0)" />
</form>

Link to comment
Share on other sites

  • 0
За вас уже все сделали, неужели трудно догадаться?

$output .= '<option value="' . $filePath . '">' . $fileName . '</option>';


<form name="form" id="form">
<select name="jumpMenu" id="jumpMenu">
echo $output;
</select>
<input type="button" name="go_button" id= "go_button" value="Go" onclick="MM_jumpMenuGo('jumpMenu','parent',0)" />
</form>

Спасибо за помощь, но при Ваших изменениях в выпадающем меню появляется только одна ссылка на самый последний файл.

2010c0dfa3a9.jpg

Link to comment
Share on other sites

  • 0
Я надеюсь вы догадались вместо:

$output .= '<a href="' . $filePath . '">' . $fileName . '</a><br/>';

Подставить:

$output .= '<option value="' . $filePath . '">' . $fileName . '</option>';

?

Бестолковый я. Да теперь выводит в выпадающем меню все файлы в корневой директории, где ссылками являются мена файлов.

1)А если я меняю имя файла на кирилицу, то ошибка с кодировкой (см.рис)

b52c6c13ea85.jpg

2)В коде есть переменная $path.. если я ее меняю с $path = "C:\server\htdocs\iamdoc"; на папку вложенную в нее $path = "C:\server\htdocs\iamdoc\_car\Belgorod"; , где лежит соответственно один файл ворда, то все равно выдается список из всех ворд файлов в C:\server\htdocs\iamdoc. Просто конкретизировать я хотел, чтобы ка-то разбить весь список на части по папкам (_car, _car1, и т.д.)

Весь код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Сканирование папок</title>
<script type="text/javascript">
<!--
function MM_jumpMenuGo(objId,targ,restore){ //v9.0
var selObj = null; with (document) {
if (getElementById) selObj = getElementById(objId);
if (selObj) eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
if (restore) selObj.selectedIndex=0; }
}
function MM_jumpMenu(targ,selObj,restore){ //v3.0
eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
if (restore) selObj.selectedIndex=0;
}
//-->
</script>
</head>

<body>
<?php
$path = "C:\server\htdocs\iamdoc\_car\Belgorod";
function normalizePath($path) {
return rtrim(str_replace(array('/', '\\'), '/', $path), '/');
}

$documentRoot = normalizePath(getenv('DOCUMENT_ROOT'));

$foundedFiles = array();
$docsDirectory = dirname(normalizePath(__FILE__));
$needleExtensions = array('doc', 'docx');

try {
$directoryIterator = new RecursiveDirectoryIterator($docsDirectory, RecursiveDirectoryIterator::KEY_AS_PATHNAME);
} catch(Exception $e){
echo $e->getMessage();
exit;
}

$dirs = new RecursiveIteratorIterator($directoryIterator, RecursiveIteratorIterator::SELF_FIRST);

foreach ($dirs as $dir => $fileInfo) {
if (true === $fileInfo->isFile() && in_array(strtolower(pathinfo(($filePath = $fileInfo->getPathname()), PATHINFO_EXTENSION)), $needleExtensions)) {
$foundedFiles[str_replace($documentRoot, '', normalizePath($filePath))] = $fileInfo->getBasename();
}
}

$output = '';
if (false === empty($foundedFiles)) {
foreach ($foundedFiles as $filePath => $fileName) {
$output.= '<option value="' . $filePath . '">' . $fileName . '</option>';
}
}

/*echo $output;*/
?>

<form name="form" id="form">
<select name="jumpMenu" id="jumpMenu">

<?php
echo $output;
?>

</select>
<input type="button" name="go_button" id= "go_button" value="Go" onclick="MM_jumpMenuGo('jumpMenu','parent',0)" />
</form>

</body>
</html>

Link to comment
Share on other sites

  • 0
По поводу кодировки - может быть конфликт utf-8 и windows-1251.

По поводу всего остального не подскажу... лень.

С кодировкой разобрался. Заменил utf (<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">). Теперь нормально отображает.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy