Winapi существует ли файл
из собственного Win32 API с помощью C++ есть ли способ определить, действительно ли окно, связанное с HWND?
вы можете использовать Win32 API IsWindow.
не рекомендуется использовать его, Хотя по 2 причинам:
- дескрипторы Windows можно повторно использовать после уничтожения окна, поэтому вы не знаете, есть ли у вас дескриптор совершенно другого окна или нет.
- состояние может измениться сразу после этого вызова, и вы будете думать, что это действительно так,но это может быть действительно не так.
из MSDN (та же ссылка, что и выше):
поток не должен использовать IsWindow для окно, которое он не создал, потому что окно может быть уничтожено после эта функция была вызвана. Дальше, потому что оконные ручки перерабатываются ручка может даже указывать на другое окно.
что можно сделать?
возможно, ваша проблема может быть перестроено так, что вам не нужно, чтобы проверить правильность обработки. Может быть, например, вы можете установить канал от клиента к серверу.
этот вопрос старый, но мне самому нужна была эта функциональность, и я был немного разочарован, прочитав о предостережениях. Однако, сделав немного больше копания, кажется, что все хорошо. Если вы не имеете дело с 16-битными программами, IsWindow, похоже, является способом пойти. Проблема повторного использования дескриптора, по-видимому, была достаточно решена в соответствии с этим:
Так, из-за верхнего 16-битного счетчика повторного использования маловероятно, что вы столкнетесь с проблемой повторного использования окна.
кроме того, это правда, что окно может быть уничтожено в любое время, если оно не находится под вашим контролем. Как заявили другие, дескриптор потенциально может принадлежать другому окну, поскольку дескрипторы используются повторно. На самом деле я не знаю, насколько это вероятно.
проверит, существует ли окно и имеет ли соответствующее имя
возможно совмещение IsWindow , FindWindow и GetWindowThreadProcessId будет более точным
Как определить, есть ли файл на диске?
Библиотечная функция access позволяет определять режим доступа к файлу, а если второй параметр mode равен нулю, то определяется только существование файла.
Хотя эта функция и не входит в стандарт C/C++, тем не менее, она присутствует в компиляторах Visual C++, Borland C++, Watcom C++ и многих других в неизменном виде.
Способ 2 (_findfirst)
Функция _findfirst возвращает информацию о первом файле, удовлетворяющем заданной маске поиска. Если указать точное имя файла, то мы сможем ответить на наш вопрос.
С помощью этого способа можно определять не только существование отдельного файла, но также и группы файлов, соответствующей заданной маске. А если задать маску как "*.*" , то можно узнать есть ли файлы в заданной директории.
Способ 3 (GetFileAttributes)
Функция GetFileAttributes Win32 API возвращает атрибуты для заданного файла или каталога. В случае ошибки возвращается значение 0xFFFFFFFF.
Этот способ используется во многих примерах из MSDN, что позволяет предположить, что это штатный способ для решения нашей задачи в Win API. Кроме того, это самый быстрый из приведенных здесь способов.
Способ 4 (FindFirstFile)
Этот способ аналогичен способу 2 с той лишь разницей, что для достижения результата используется функция Win32 API.
Способ 5 (MFC)
MFC содержит класс-обёртку для функций Find. API. Мы вполне можем использовать этот класс.
Способ 6 (WTL)
Среди прочих классов, подобных MFC, WTL также содержит и CFindFile .Следовательно, этот способ внешне ни чем не отличается от предыдущего, кроме того, что не требует MFC.DLL. На самом деле этот способ намного быстрее предыдущего. Дело в том, что все функции класса CFindFile являются inline ,так что код, генерируемый компилятором, почти целиком совпадает с кодом для способа 4.
Способ 7 (PathFileExists)
Ещё один способ из предложенных Александром Шаргиным - использование SHLWAPI Path API .
Правда у этого способа имеются определённые недостатки, которые значительно сужают его практическое применение:
- Он не будет работать, если на компьютере не установлен Internet Explorer 4.0 или выше, что может быть вполне вероятно на компьютерах с ранними версиями Windows 95 и Window NT 4.0.
- Функция PathFileExists() не поддерживает UNC имена файлов.
Способ 8 (CreateFile)
Самый очевидный и самый громоздкий способ.
Способ 9 (Pure C++ метод std::ifstream, ::ifstream)
Данный метод состоит в создании временного объекта класса ifstream .Если файл с указанным именем не существует то operator void *() этого класса возвращает NULL pointer - иначе возвращается указатель на сам созданный объект ( this ). Это значение проверяется на NULL pointer - и . все.
. вернее почти все =)
В данном коде ifstream это typedef basic_ifstream < char , char_traits < char >> ifstream; если же Вы пользуетесь старыми заголовочными файлами (с расширением .h) - то для Вас ifstream - это никакой не typedef - а самый настоящий класс. И все было бы прекрасно - если бы не одно но - в этом случае конструктор с именем файла в качестве параметра СОЗДАСТ файл (если он не существует) и в любом случае, проверка на существование файла даст положительный результат. Дело в том, что для "старого" ifstream 'а надо явно указывать что НЕ надо создавать файл через добавление флага ios:: nocreate во втором параметре конструктора. А вот и сам код для такого случая:
Данный метод хорош тем что он 100% портабелен - то есть используются только возможности самого языка С++ (в лице его стандартной библиотеки - которая является его частью).
Способ 11 (Script)
Ни один из перечисленных способов не будет работать из .html документа. Зато из скрипта доступен Scripting.FileSystemObject и нам этого достаточно.
Мы вполне можем использовать Scripting.FileSystemObject и в COM-модуле:
Фактически, это очень извращенный способ вызова все той же функции access() из способа 1, с той разницей, что FileSystemObject работает с именами файлов в UNICODE и под WindowsNT/2k передает имя файла напрямую, а под Windows 9x/Me (и даже 3.1 с интернет эксплорером!) сам преобразовывает его в ANSI.
Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
Здравствуйте, mogadanez, Вы писали:
M>пытаюсь :
M>if((GetFileAttributes("c:\\temp")&FILE_ATTRIBUTE_DIRECTORY)==16)
Так ведь вместо "c:\\temp" должен быть hFile (хэндл открытого файла).
И потом, вместо 16 — FILE_ATTRIBUTE_DIRECTORY.
Кажется так.
m> как проверить?
m>
m> пытаюсь :
m> if((GetFileAttributes("c:\\temp")&FILE_ATTRIBUTE_DIRECTORY)==16)
m>
m> не катит
попробуй так:
Прошу прощение за предыдущий ответ (все туфта), погорячился.
Полность согласен с PM.
Мало ли, вдруг пригодится:
A>Мало ли, вдруг пригодится:
A>
Это же для создания а не для проверки
От: | Unmanaged | ICQ 476611995 |
Дата: | 27.11.07 21:29 | |
Оценка: | 23 (5) |
Мало кто знает об этой группе функций.
Тем не менее в неё входят очень и очень полезные API.
PathIsDirectory() — проверяет существование папки.
PathIsDirectoryEmpty() — проверяет существование папки и что папка пуста.
PathFileExists() — проверяет существование папки или файла.
PathIsExe() — проверяет является ли файл исполняемым.
PathIsFileSpec() — проверяет является ли переданное имя именем или путём (абсолютным или относительным).
PathIsSystemFolder() — проверяет является ли папка системной.
PathIsURL() — проверяет является ли переданная строка правильно составленным URL.
PathIsUNC() — проверяет является ли данный путь сетевым.
PathMatchSpec() — проверяет подходит ли данное имя по данной маске.
А вообще см. здесь — Shell Lightweight Utility Functions.
Загляните туда и вы откроете для себя много нового.
All DbgHelp functions, such as this one, are single threaded. Therefore, calls from more than one thread to this function will likely result in unexpected behavior or memory corruption. To avoid this, you must synchronize all concurrent calls from more than one thread to this function.
(c) MSDN
Здравствуйте, Lepsik, Вы писали:
L>Это же для создания а не для проверки
Как определить, есть ли файл на диске?
Библиотечная функция access позволяет определять режим доступа к файлу, а если второй параметр mode равен нулю, то определяется только существование файла.
Хотя эта функция и не входит в стандарт C/C++, тем не менее, она присутствует в компиляторах Visual C++, Borland C++, Watcom C++ и многих других в неизменном виде.
Способ 2 (_findfirst)
Функция _findfirst возвращает информацию о первом файле, удовлетворяющем заданной маске поиска. Если указать точное имя файла, то мы сможем ответить на наш вопрос.
С помощью этого способа можно определять не только существование отдельного файла, но также и группы файлов, соответствующей заданной маске. А если задать маску как "*.*" , то можно узнать есть ли файлы в заданной директории.
Способ 3 (GetFileAttributes)
Функция GetFileAttributes Win32 API возвращает атрибуты для заданного файла или каталога. В случае ошибки возвращается значение 0xFFFFFFFF.
Этот способ используется во многих примерах из MSDN, что позволяет предположить, что это штатный способ для решения нашей задачи в Win API. Кроме того, это самый быстрый из приведенных здесь способов.
Способ 4 (FindFirstFile)
Этот способ аналогичен способу 2 с той лишь разницей, что для достижения результата используется функция Win32 API.
Способ 5 (MFC)
MFC содержит класс-обёртку для функций Find. API. Мы вполне можем использовать этот класс.
Способ 6 (WTL)
Среди прочих классов, подобных MFC, WTL также содержит и CFileFind .Следовательно, этот способ внешне ни чем не отличается от предыдущего, кроме того, что не требует MFC.DLL. На самом деле этот способ намного быстрее предыдущего. Дело в том, что все функции класса CFileFind являются inline ,так что код, генерируемый компилятором, почти целиком совпадает с кодом для способа 4.
Способ 7 (PathFileExists)
Ещё один способ из предложенных Александром Шаргиным - использование SHLWAPI Path API .
Правда у этого способа имеются определённые недостатки, которые значительно сужают его практическое применение:
- Он не будет работать, если на компьютере не установлен Internet Explorer 4.0 или выше, что может быть вполне вероятно на компьютерах с ранними версиями Windows 95 и Window NT 4.0.
- Функция PathFileExists() не поддерживает UNC имена файлов.
Способ 8 (CreateFile)
Самый очевидный и самый громоздкий способ.
Способ 9 (Pure C++ метод std::ifstream, ::ifstream)
Данный метод состоит в создании временного объекта класса ifstream .Если файл с указанным именем не существует то operator void *() этого класса возвращает NULL pointer - иначе возвращается указатель на сам созданный объект ( this ). Это значение проверяется на NULL pointer - и . все.
. вернее почти все =)
В данном коде ifstream это typedef basic_ifstream < char , char_traits < char >> ifstream; если же Вы пользуетесь старыми заголовочными файлами (с расширением .h) - то для Вас ifstream - это никакой не typedef - а самый настоящий класс. И все было бы прекрасно - если бы не одно но - в этом случае конструктор с именем файла в качестве параметра СОЗДАСТ файл (если он не существует) и в любом случае, проверка на существование файла даст положительный результат. Дело в том, что для "старого" ifstream 'а надо явно указывать что НЕ надо создавать файл через добавление флага ios:: nocreate во втором параметре конструктора. А вот и сам код для такого случая:
Данный метод хорош тем что он 100% портабелен - то есть используются только возможности самого языка С++ (в лице его стандартной библиотеки - которая является его частью).
Способ 11 (Script)
Ни один из перечисленных способов не будет работать из .html документа. Зато из скрипта доступен Scripting.FileSystemObject и нам этого достаточно.
Мы вполне можем использовать Scripting.FileSystemObject и в COM-модуле:
Фактически, это очень извращенный способ вызова все той же функции access() из способа 1, с той разницей, что FileSystemObject работает с именами файлов в UNICODE и под WindowsNT/2k передает имя файла напрямую, а под Windows 9x/Me (и даже 3.1 с интернет эксплорером!) сам преобразовывает его в ANSI.
Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
Я хотел бы найти самый быстрый способ проверить, существует ли файл в стандартном c/" >C++11, C++ или C. У меня есть тысячи файлов, и прежде чем что-то делать на них, мне нужно проверить, все ли они существуют. Что я могу написать вместо /* SOMETHING */ в следующей функции?
Ну, я собрал тестовую программу, которая запускала каждый из этих методов 100 000 раз, наполовину на файлах, которые существовали, и наполовину на файлах, которые не существовали.
результаты за общее время выполнения 100 000 вызовов в среднем за 5 запусков,
на stat() функция обеспечила лучшую производительность в моей системе (Linux, скомпилированный с g++ ), со стандартным fopen звоните лучше всего, если вы по какой-то причине отказываетесь использовать функции POSIX.
Я использую этот кусок кода, он работает со мной до сих пор. Это не использует много причудливых функций C++:
Примечание : В C++14, и как только файловая система TS будет закончено и принято, решение будет использовать:
и так как C++17, только:
Это зависит от того, где эти файлы находятся. Например, если все они должны находиться в одном каталоге, вы можете прочитать все записи каталога в хэш-таблицу, а затем проверить все имена в хэш-таблице. Это может быть быстрее в некоторых системах, чем проверять каждый файл по отдельности. Самый быстрый способ проверить каждый файл индивидуально зависит от вашей системы . если вы пишете ANSI C, самый быстрый способ - fopen потому что это единственный способ (файл может существовать, но не открываем, но вы, вероятно, действительно хотите открыть, если вам нужно "что-то сделать"). C++, POSIX, Windows предлагают дополнительные опции.
пока я здесь, позвольте мне указать на некоторые проблемы с вашим вопросом. Вы говорите, что хотите самый быстрый способ и что у вас есть тысячи файлов, но затем вы просите код для функции для тестирования одного файла (и эта функция действительна только на C++, а не на C). Это противоречит вашим требованиям, делая предположение о решении . случай проблема XY. Вы также говорите "в стандартном c++11 (или)C++(или) c" . которые все разные, и это также несовместимо с вашим требованием к скорости . самое быстрое решение - адаптация кода к целевой системе. Несоответствие в вопросе подчеркивается тем фактом, что вы приняли ответ, который дает решения, зависящие от системы и не являющиеся стандартными C или c++.
для тех, кто любит boost:
без использования других библиотек мне нравится использовать следующий фрагмент кода:
Читайте также: