Что такое код opendir


Ошибка Opendir; Нет такого файла или каталога

Это может быть очень простой вопрос. Я работаю в каталоге /mobile, и у меня есть фотографии в каталоге /uploads.

Я получаю сообщение об ошибке:

Warning: opendir(http://www.yoozpaper.com/uploads) [function.opendir]: failed to open dir: not implemented in /hermes/bosweb/web088/b881/ipg.yoozpapercom/mobile/sportspage.php on line 313

Я помещаю это в переменную $dir = «http://www.yoozpaper.com/uploads»

для изображения src=$dir/$file .

Обратите внимание, что это работает, когда я работаю с файлами в основном каталоге.

Любая помощь по этому поводу будет принята с благодарностью.

Используйте opendir один раз вместо того, чтобы использовать его в цикле for

У меня есть код ниже, чтобы получить контент из удаленного каталога.

Теперь дело в том, что код выше forloop , когда я положил $dirHandle = opendir(«ssh2.sftp://$sftp/».PNB_PATH_OUT); за пределами forloop, то это дает мне требуемый результат только для первой записи. Итак, очевидно, что это readdir не работает для второй записи в forloop ,

Как я могу сделать это таким образом, что мне нужно использовать opendir только один раз и использовать это соединение более 1 раза?

Требуемое решение

Решение

Ваш цикл while обходит весь каталог, пока не останется больше файлов, и в этом случае readdir возвращает false. Поэтому всякий раз, когда readdir вызывается после первого обхода, он просто возвращает false, потому что он уже находится в конце каталога.

Вы могли бы использовать rewinddir () в цикле for для сброса указателя дескриптора каталога на начало.

Поскольку поток sftp, по-видимому, не поддерживает поиск, вы должны просто сохранить нужные результаты и выполнить цикл for после цикла while. В конце концов, вы проходите один и тот же каталог несколько раз.

Могу ли я управлять потоком каталогов, полученный с opendir ()?

Функция opendir() возвращает указатель на поток каталога DIR * , который очевидно является непрозрачным типом данных. Реализация скрыта.

В Libc ручной говорится , что вы не должны выделять DIR объект самостоятельно , и пусть функции каталога обрабатывать распределение.

Есть ли способ , чтобы управлять потоком каталогов после получения его opendir() и перед передачей его, например, readdir() ?

Я в принципе хочу перегружать opendir() с LD_PRELOAD возвращать поток манипулируют каталог, который используется readdir() .

Это может помочь взглянуть на то , что LD_PRELOAD sortdir делает , как он сортирует записи каталога , прежде чем давать их в программу хотя то , что вы можете сделать , может быть что — то другое , чем сортировка.

sortdir заменяет opendir , readdir , readdir64 и closedir и быть только 197 строк кода, он будет служить вам хорошо смотреть на него.

Я не считаю , что это возможно, или по крайней мере не представляется возможным в любом виде портативной моды. Как вы сказали , что DIR* тип непрозрачный указатель. DIR Файл определяется в реализации определенной моды в файле не имеют доступа.

Для того , чтобы манипулировать возвращенное DIR значение , которое вы должны были бы создать struct аналогичную структуру , которая содержит манипулирует значение. Реализации могут свободно изменять определение DIR или изменить его без предупреждения (это непрозрачное в конце концов). Таким образом , любая реализация вы добавили бы хрупкой в лучшем случае .

Если я вас правильно, вы хотите, чтобы манипулировать записи каталога, имена файлов, например, изменений или добавления фиктивных записей. Вы можете сделать это, как это.

Перегрузка opendir() , в нем действительно открыть каталог с «реальным» opendir() , сразу же прочитать все записи каталога, с «реальным» readdir() , изменить то , что необходимо, сохраните измененную версию в глобальной переменной и вернуть неизмененной DIR * . Тогда в перегруженных readdir() вы лечите прошли DIR * как свое собственное непрозрачное значение (например , ключ в карте) и просто последовательно возвращать ранее подготовленные записи.

Вот противное доказательство концепции (противной, потому что я пропустил скучную часть, как проверка ошибок, закрытие ресурса, освобождая оперативную память, безопасность потоков и т.д.):

PHP opendir() не отображает папки на кириллице?

Стоит задача разработать файловый менеджер, приступил.
Первое с чем столкнулся, это то что opendir не отображает папки на русском, и соответственно не переходит к ним.
Вот код, в директории documents лежит папка «Новая папка». Отображает он ее так:

Вообще поискал информации, мне объяснили легче в транслит переводить. Но это неудобно, подскажите как действовать в данной ситуации.

Скрипт крутится на win 8 (open server) но по завершению естественно CentOS

Суть вопроса в том что, opendir не открывает папки с русскими буквами! Как это решить?

Open directory using C

I am accepting the path through command line input.

it doesn’ t enter the loop. i.e dir==null .

How do I pass the command line input to dir pointer?

4 Answers 4

You should really post your code, but here goes. Start with:

You need to check in your case that args[1] is both set and refers to an actual directory. When this is run with:

( tmp is a subdirectory off my current directory but you can use any valid directory), I get:

Илон Маск рекомендует:  Структурные псевдоклассы

Note that you have to pass a directory in, not a file. When I execute:

because that’s a file rather than a directory (if you’re sneaky, you can attempt to use diropen(dirname(v[1])) if the initial diropen fails).

Some feedback on the segment of code, though for the most part, it should work.

  • int main — the standard defines main as returning an int .
  • c and args are typically named argc and argv , respectfully, but you are allowed to name them anything
  • You have a buffer overflow here: If args[1] is longer than 50 bytes, buffer will not be able to hold it, and you will write to memory that you shouldn’t. There’s no reason I can see to copy the buffer here, so you can sidestep these issues by just not using strcpy .

If this returning NULL , it can be for a few reasons:

  • The directory didn’t exist. (Did you type it right? Did it have a space in it, and you typed ./your_program my directory , which will fail, because it tries to opendir(«my») )
  • You lack permissions to the directory
  • There’s insufficient memory. (This is unlikely.)

opendir

(PHP 4, PHP 5, PHP 7)

opendir — Открывает дескриптор каталога

Описание

Открывает дескриптор каталога для последующего использования с функциями closedir() , readdir() и rewinddir() .

Список параметров

Путь к открываемому каталогу

Для описания параметра context обратитесь к разделу Потоки.

Возвращаемые значения

Возвращает дескриптор каталога ( resource ) в случае успеха, или FALSE в случае возникновения ошибки


Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING .

Может произойти, если path не является директорией, директория не может быть открыта из-за недостаточных разрешений или из-за ошибок файловой системы.

Примеры

Пример #1 Пример использования функции opendir()

// Открыть известный каталог и начать считывать его содержимое
if ( is_dir ( $dir )) <
if ( $dh = opendir ( $dir )) <
while (( $file = readdir ( $dh )) !== false ) <
echo «файл: $file : тип: » . filetype ( $dir . $file ) . «\n» ;
>
closedir ( $dh );
>
>
?>

Результатом выполнения данного примера будет что-то подобное:

Смотрите также

  • is_dir() — Определяет, является ли имя файла директорией
  • readdir() — Получает элемент каталога по его дескриптору
  • dir() — Возвращает экземпляр класса Directory

User Contributed Notes 32 notes

Sometimes the programmer needs to access folder content which has arabic name but the opendir function will return null resources id

for that we must convert the dirname charset from utf-8 to windows-1256 by the iconv function just if the preg_match function detect arabic characters and use » U » additionality to enable multibyte matching

= ( «./» ); // on this file dir

// detect if the path has arabic characters and use » u » optional to enable function to match multibyte characters

// convert input ( utf-8 ) to output ( windows-1256 )

$dir = iconv ( «utf-8» , «windows-1256» , $dir );

if( ( $dh = opendir ( $dir ) ) !== null )
<

while ( ( $file = readdir ( $dh ) ) !== false )
<

echo «filename: » . $file . » filetype : » . filetype ( $dir . $file ). «
» ;

iterated function that searches a folder or file in a directory.

= ‘../Classes’ ;
$search_parameter = «CachedObjectStorageFactory.php» ;

//if we call the function spider as spider($root);
//will show all the directory content including subdirectories

//if we call the function spider as spider(‘../Classes’, ‘Shared’);
//and will show the address of the directory

spider ( $root , $search_parameter );
closedir ();

function spider ( $dir , $fileName = «» )<

$handle = opendir ( $dir );

while( $file = readdir ( $handle ))<

if( $fileName == «» )
echo $dir . «/» . $file . «
» ;
else
if( $file == $fileName )
echo $dir . «/» . $file . «
» ;

if(! is_file ( $dir . «/» . $file ))
spider ( $dir . «/» . $file , $fileName );

Here is a snippet to create a site map of all html files in a folder:

// read all html file in the current directory
if ( $dh = opendir ( ‘./’ )) <
$files = array();
while (( $file = readdir ( $dh )) !== false ) <
if ( substr ( $file , strlen ( $file ) — 5 ) == ‘.html’ ) <
array_push ( $files , $file );
>
>
closedir ( $dh );
>

// Sort the files and display
sort ( $files );
echo »

    \n» ;
    foreach ( $files as $file ) <
    $title = Title ( $file );
    echo «
  • $file \» title=\» $title \»> $title \n» ;
    >
    echo «

\n» ;

// Function to get a human readable title from the filename
function Title ( $filename ) <
$title = substr ( $filename , 0 , strlen ( $filename ) — 5 );
$title = str_replace ( ‘-‘ , ‘ ‘ , $title );
$title = ucwords ( $title );
return $title ;
>
?>

Here are two versions of the same function to list all files in a directory tree.

The first one is recursive (calls itself while going through subdirectories) :
function rec_listFiles ( $from = ‘.’ )
<
if(! is_dir ( $from ))
return false ;

$files = array();
if( $dh = opendir ( $from ))
<
while( false !== ( $file = readdir ( $dh )))
<
// Skip ‘.’ and ‘..’
if( $file == ‘.’ || $file == ‘..’ )
continue;
$path = $from . ‘/’ . $file ;
if( is_dir ( $path ) )
$files += rec_listFiles ( $path );
else
$files [] = $path ;
>
closedir ( $dh );
>
return $files ;
>
?>

The second one is iterative (uses less memory) :
function listFiles ( $from = ‘.’ )
<
if(! is_dir ( $from ))
return false ;

$files = array();
$dirs = array( $from );
while( NULL !== ( $dir = array_pop ( $dirs )))
<
if( $dh = opendir ( $dir ))
<
while( false !== ( $file = readdir ( $dh )))
<
if( $file == ‘.’ || $file == ‘..’ )
continue;
$path = $dir . ‘/’ . $file ;
if( is_dir ( $path ))
$dirs [] = $path ;
else
$files [] = $path ;
>
closedir ( $dh );
>
>
return $files ;
>
?>
The iterative version should be a little faster most of the time, but the big difference is in the memory usage.

Илон Маск рекомендует:  Горячие клавиши visual basic

Here is also a profiling function (works in php5 only) :
function profile ( $func , $trydir )
<
$mem1 = memory_get_usage ();
echo » ;
$mem2 = memory_get_peak_usage ();

printf ( » ,
( $mem2 — $mem1 )/ 1024.0 , $time );
return $list ;
>
?>

A couple of notes on Matt’s posts on Windows Network Drives:

Since the system() command writes the output of the executed shell command straight to the output buffer, if you wish to hide the return of the mapping command (i.e. «The command completed succesfully» or an error message) from a web browser, you need to alter the command that is sent to the shell so that the output of that command is hidden.

You probably thinking «why not just use exec()?», and it’s a reasonable question, but for some reason it doesn’t always work — I guess it’s another NT user permissions issue. If you want to guarantee you app will work with no messing around on the host system, use the system() command.

In the Windows command shell, you can hide the output of a command by sending both the output (1) and error (2) messages to «nul» using pipes, in other words «>nul 2>&1» on the end of the command. The username and password order in the «net use. » command needs switching in Matt’s post.

Here (http://networkm.co.uk/static/drive.html) is a function I wrote to dynamically choose which drive letter to use, based on what is currently mapped and accessible to PHP.

// Define the parameters for the shell command
$location = «\\servername\sharename» ;
$user = «USERNAME» ;
$pass = «PASSWORD» ;
$letter = «Z» ;

// Map the drive
system ( «net use » . $letter . «: \»» . $location . «\» » . $pass . » /user:» . $user . » /persistent:no>nul 2>&1″ );

// Open the directory
$dir = opendir ( $letter . «:/an/example/path» )

I sometimes find this useful. Hope you will too.

//list_by_ext: returns an array containing an alphabetic list of files in the specified directory ($path) with a file extension that matches $extension

function list_by_ext ( $extension , $path ) <
$list = array(); //initialise a variable
$dir_handle = @ opendir ( $path ) or die( «Unable to open $path » ); //attempt to open path
while( $file = readdir ( $dir_handle )) < //loop through all the files in the path
if( $file == «.» || $file == «..» ) //ignore these
$filename = explode ( «.» , $file ); //seperate filename from extenstion
$cnt = count ( $filename ); $cnt —; $ext = $filename [ $cnt ]; //as above
if( strtolower ( $ext ) == strtolower ( $extension )) < //if the extension of the file matches the extension we are looking for.
array_push ( $list , $file ); //. then stick it onto the end of the list array
>
>
if( $list [ 0 ]) < //. if matches were found.
return $list ; //. return the array
> else < //otherwise.
return false ;
>
>

//example usage
if( $win32_exectuables = list_by_ext ( «exe» , «C:\WINDOWS» )) <
var_dump ( $win32_exectuables );
> else <
echo «No windows executables found :(\n» ;
>

This function sorts files by name as strings, but without regard to case. It also does some handy string formatting of the file size information.

1024) $files[$fkey][‘sizetext’] = (ceil($a[‘size’]/1024*100)/100) . » K»;
else if ($a[‘size’] > 1024*1024) $files[$fkey][‘sizetext’] = (ceil($a[‘size’]/(1024*1024)*100)/100) . » Mb»;
else $files[$fkey][‘sizetext’] = $a[‘size’] . » bytes»;
$files[$fkey][‘name’] = $file;
$files[$fkey][‘type’] = filetype($fullpath);
$fileNames[$i++] = $fkey;
>
closedir($dh);
> else die («Cannot open directory: $path»);
> else die («Path is not a directory: $path»);
sort($fileNames,SORT_STRING);
$sortedFiles = array();
$i = 0;
foreach($fileNames as $f) $sortedFiles[$i++] = $files[$f];

$files = getFiles(«C:»);
foreach ($files as $file) print «$file[name]
\n»;
?>

A simple piece to open a directory and display any files with a given extension. Great for things like newsletters, score sheets or the like where you just want to make it easy on the user — they just dump in the file with the correct extension and it’s done. A link is given to the file which opens up in a new window.

= » $DOCUMENT_ROOT » . «dirname/» ; //Put in second part, the directory — without a leading slash but with a trailing slash!
$dir = opendir ( $current_dir ); // Open the sucker

List of available files:

» );
while ( $file = readdir ( $dir )) // while loop
<
$parts = explode ( «.» , $file ); // pull apart the name and dissect by period
if ( is_array ( $parts ) && count ( $parts ) > 1 ) < // does the dissected array have more than one part
$extension = end ( $parts ); // set to we can see last file extension
if ( $extension == «ext» OR $extension == «EXT» ) // is extension ext or EXT ?
echo » $file \» target=\»_blank\»> $file
» ; // If so, echo it out else do nothing cos it’s not what we want
>
>
echo »
» ;
closedir ( $dir ); // Close the directory after we are done
?>

I was trying to access network drives using this opendir function. I read so many posts saying that it was almost impossible to access a network drive and finally, I found the answer; there are 2 steps to be followed to access a network drive with PHP either on the same machine or another machine.

But first of all, here’s the error I was getting:
Warning: opendir(\\server\folder1\sub_folder) [function.opendir]: failed to open dir: No error in C:\wamp\www\PMOT\v0.1\REPORT_MENU\index.php on line 17


Firstly, one must make sure that the folder \\server\folder1\sub_folder can be accessed by a user, let’s say USER_TEST with a password PASS_TEST. By setting properties to this folder, one can add this given user with the correct password (USER_TEST with PASS_TEST).

Илон Маск рекомендует:  Iis веб и ftp узлы

Secondly, the APACHE service must be set-up to take this user into account. If no user is specified, APACHE uses an anonymous user and this is where the problem/error message is coming from. One must go in control panel->administrative tools->services. One will see the list of services and must look for APACHE with Apache/2.X.X in the description. (For Wampserver, it will be called wampapache, and so on!) Right click on that and pop up the properties screen. In the tab LOG ON, there are 2 options: local system account and «this account» which will be a user specified account. This is where one must specify the USER_TEST and PASS_TEST.

Following these steps worked perfectly for me but if either the folder privileges or apache log on user is disabled, then I get the initial aforementioned error message.

Что такое код opendir

в теории должно работать так , зашел на страницу с переменной которая имеет значение 2
$str = 2
эту переменую я превращаю в сесию
$_SESSION[‘loadfa’] = $str;

дальше по нажатию на ссылку у меня подгружается на существующую страницу еще 1 страница и открывается папка с картинками где значение папки совпадает со значением переменной.

делал сначала так открывалась через значение сессии , но были какие то лишние картинки

$dir = opendir («siemka/$loadfa»);

и на форуме мне показали что надо такой код

if ($handle = opendir(‘siemka/$loadfa’)) <
while (false !== ($file = readdir($handle))) <
if ($file != «.» && $file != «..») <
echo »
«;
>
>
closedir($handle);
>

вроде все теперь ошибок нет , ну этот кусок почему то не реагирует на сессию , тоесть никакая папка не открываеться , только если подставить циферку вместо этого

Может быть не:
if ($handle = opendir(‘siemka/$loadfa’)) <

а всё таки:
if ($handle = opendir(‘siemka/’.$_SESSION[‘loadfa’])) <

02.11.2011, 22:07 #2

Может быть не:
if ($handle = opendir(‘siemka/$loadfa’)) <

а всё таки:
if ($handle = opendir(‘siemka/’.$_SESSION[‘loadfa’])) <

02.11.2011, 22:22 #3
02.11.2011, 22:24 #4
вроде же все сессии автоматически становятся переменными

С каких пор? У вас что глобальные переменные включены?

А вообще посмотрите, что у вас кавычки отличаются. НО, пишите всегда так как я вам написал.

в строках заключенных в одиночные кавычки PHP не обрабатывает переменные,
т.е. в строке
if ($handle = opendir(‘siemka/$loadfa’)) <
$loadfa не будет заменена значением этой переменной и останется как есть, а если все-таки хотите, чтобы переменная заменялась внутри строки ее значением, используйте двойные кавычки:
if ($handle = opendir(«siemka/$loadfa»)) <

(я всегда избегаю использование такой возможности, или
if ($handle = opendir(«siemka/».$loadfa)) <
а еще лучше
if ($handle = opendir(‘siemka/’.$loadfa)) <
,т.к. быстрее выполняется)

Добавлено:
а глобальные переменные лучше отключить
чтобы, если у Вас есть $_SESSION[‘loadfa’], эта переменная не была доступна по $loadfa

opendir и /

Автор: kvant, 10 января 2011 в PHP

Рекомендованные сообщения

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Войти

Уже зарегистрированы? Войдите здесь.

Статистика пользователей

Сейчас на странице 0 пользователей

Нет пользователей, просматривающих эту страницу.

Спрашивают сейчас

Автор: Адам Грир
Создана 14 июня

Автор: Наталья12
Создана Понедельник в 18:35

Используйте opendir один раз вместо того, чтобы использовать его в цикл

У меня есть ниже код, чтобы получить содержимое из удаленного каталога.

Теперь, вещь, приведенный выше код в forloop . когда я ставлю $dirHandle = opendir(ssh2.sftp://$sftp/.PNB_PATH_OUT); вне forloop то это дает мне необходимый результат только для первой записи. Таким образом, очевидно , что это readdir не работает для второй записи в forloop .

Как я могу сделать это таким образом , что мне нужно использовать opendir только один раз и использовать это соединение более чем 1 раз?

Требуемое решение

Ваш цикл, пока пересекающий весь каталог до тех пор, пока не останется больше файлов, в этом случае READDIR возвращает ложь. Поэтому в любое время READDIR вызывается после первого обхода, он просто возвращает ложь, потому что это уже в конце каталога.

Вы можете использовать rewinddir () в цикл для сброса указателя ручки каталога начала.

Так как поток SFTP, как представляется, не поддерживает поиск, вы должны просто хранить необходимые результаты и сделать для цикла после цикла. Вы, в конце концов, проходя тот же каталог, несколько раз.

Ошибка Opendir; Нет такого файла или каталога

Это может быть очень простой вопрос. Я работаю в каталоге / mobile, и у меня есть фотографии в каталоге / uploads.

Я получаю сообщение об ошибке:

Warning: opendir(http://www.yoozpaper.com/uploads) [function.opendir]: failed to open dir: not implemented in /hermes/bosweb/web088/b881/ipg.yoozpapercom/mobile/sportspage.php on line 313

Я помещаю это в переменную $ dir = «http://www.yoozpaper.com/uploads»

для изображения src=$dir/$file .

Обратите внимание, что это работает, когда я работаю с файлами в основном каталоге.

Любая помощь по этому вопросу будет принята с благодарностью.

// может указывать высоту и ширину ниже

Вы должны понимать разницу между файловой системой и демоном HTTP .
Хотя они имеют несколько схожий внешний вид, это совершенно разные вопросы.

Чтобы использовать opendir, вам нужно открыть * каталог , а не HTTP-ресурс.

было бы лучше, поскольку оно всегда будет указывать на каталог загрузок, независимо от того, где вы его назвали.

http://www.yoozpaper.com/uploads нам URL-адрес, а не каталог. Вы не можете получить к нему доступ, используя opendir. Вам нужен системный путь к нему, например, «/ home / user / public_html / uploads» или что-то в этом роде. Получить путь к каталогу с помощью файлового менеджера или панели управления

Это может быть «/ hermes / bosweb / web088 / b881 /» в вашем случае. но не уверен. В любом случае, получите локальный путь

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
02.11.2011, 22:34 #5