En última instancia, quiero viajar a través de los archivos y subdirectorios de una carpeta y escribir algo en todos los archivos que encuentro que tienen cierta extensión (.wav en mi caso). cuando bucle, ¿cómo puedo saber si el elemento en el que estoy es un directorio?Cómo recorrer recursivamente directorios en C en Windows
Respuesta
opendir y readdir (en UNIX), he aquí un ejemplo:
http://opengroup.org/onlinepubs/007908775/xsh/readdir.html
o FindFirstFile en las ventanas
también se puede utilizar la cáscara con bastante facilidad:
find . -name "*.wav"
or
ls **/*.wav (in zsh and newer bashes)
¡Uy !, se olvidó de decir que estoy haciendo esto también en windoze. – pmilb
Based en su mención de .wav
, voy a adivinar que está escribiendo código para Windows (que parece ser donde *.wav
son los archivos más comunes). En este caso, usa FindFirstFile
y FindNextFile
para recorrer directorios. Estos utilizan una estructura WIN32_FIND_DATA
, que tiene un miembro dwFileAttributes
que contiene indicadores que indican los atributos del archivo. Si dwAttributes & FILE_ATTRIBUTE_DIRECTORY
es distinto de cero, tiene el nombre de un directorio.
Sí, estoy haciendo esto en Windows. Mi C está muy oxidado, no lo he programado en C desde hace unos años. Intenté usar dirent.h, pero no creo que ofrezca ninguna forma de decir si el elemento es un directorio o no. No se puede encontrar un buen ejemplo de FindFirstFile de google – pmilb
Esta página muestra cómo usarlos (en VB, pero la traducción a C debería ser más o menos directa): http://support.microsoft.com/kb/185476. Tenga en cuenta que también le conviene pensar en la forma en que maneja las uniones NTFS, es decir, si las sigue o no, y si desea evitar ciclos infinitos. – Carsten
Aquí es cómo lo hace (esto es todo de la memoria lo que puede haber errores):
void FindFilesRecursively(LPCTSTR lpFolder, LPCTSTR lpFilePattern)
{
TCHAR szFullPattern[MAX_PATH];
WIN32_FIND_DATA FindFileData;
HANDLE hFindFile;
// first we are going to process any subdirectories
PathCombine(szFullPattern, lpFolder, _T("*"));
hFindFile = FindFirstFile(szFullPattern, &FindFileData);
if(hFindFile != INVALID_HANDLE_VALUE)
{
do
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// found a subdirectory; recurse into it
PathCombine(szFullPattern, lpFolder, FindFileData.cFileName);
FindFilesRecursively(szFullPattern, lpFilePattern);
}
} while(FindNextFile(hFindFile, &FindFileData));
FindClose(hFindFile);
}
// Now we are going to look for the matching files
PathCombine(szFullPattern, lpFolder, lpFilePattern);
hFindFile = FindFirstFile(szFullPattern, &FindFileData);
if(hFindFile != INVALID_HANDLE_VALUE)
{
do
{
if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
// found a file; do something with it
PathCombine(szFullPattern, lpFolder, FindFileData.cFileName);
_tprintf_s(_T("%s\n"), szFullPattern);
}
} while(FindNextFile(hFindFile, &FindFileData));
FindClose(hFindFile);
}
}
por lo que podría llamar a esto como
FindFilesRecursively(_T("C:\\WINDOWS"), _T("*.wav"));
permite encontrar todos los archivos * .wav archivos en C: \ WINDOWS y sus subdirectorios.
Técnicamente no tiene que hacer dos llamadas a FindFirstFile(), pero creo que las funciones de coincidencia de patrones que proporciona Microsoft (es decir, PathMatchFileSpec o lo que sea) no son tan capaces como FindFirstFile(). Aunque para "* .wav" probablemente estaría bien.
verificación de estos enlaces
Las respuestas solo de enlace están mal vistas. Incluso copiando y pegando el núcleo de esas páginas sería mejor. – Synetech
de gran ayuda. Tenía de todos modos, un desbordamiento de pila ya que siempre estaba agregando "." a la ruta y regresar a la misma ruta = bucle sin fin.
La adición de este resolvió:
// found a subdirectory; recurse into it PathCombine(szFullPattern, lpFolder, FindFileData.cFileName); FindFilesRecursively(szFullPattern, lpPattern); if (FindFileData.cFileName[0] == '.') continue;
Eso excluiría * todos * directorios comenzando con un punto (incluidos los directorios ocultos que provienen de los sistemas * nix). – Synetech
- 1. ¿Cómo crear directorios recursivamente en ruby?
- 2. Comando para eliminar recursivamente todos los directorios .svn en Windows
- 3. ¿Cómo puedo leer recursivamente directorios en Perl?
- 4. Abrir algunos directorios recursivamente en Dired
- 5. ¿Cómo puedo recorrer directorios nombrados en japonés en Python?
- 6. crear archivos, crear directorios recursivamente
- 7. Copiar archivos o directorios recursivamente en Python
- 8. vb.net ¿cómo recorrer una lista de directorios?
- 9. ¿Cómo accedo a directorios especiales en Windows?
- 10. Encontrar recursivamente solo directorios con FileUtils.listFiles
- 11. Comando UNIX para cambiar recursivamente los permisos en los directorios?
- 12. Ruby: ¿cómo puedo encontrar y eliminar directorios vacíos recursivamente?
- 13. Cómo recursivamente enumerar todos los archivos y directorios
- 14. Cómo usar "svn add" recursivamente en la consola de Windows?
- 15. ¿Hay algún método en Objective-C para crear recursivamente directorios a partir de una cadena?
- 16. ¿Cómo crear recursivamente un directorio en Qt?
- 17. Java7 WatchService - Error de acceso denegado al intentar eliminar directorios anidados recursivamente vistos (solo Windows)
- 18. PHP Elimina recursivamente los directorios vacíos con los iteradores SPL
- 19. ¿Puedes recorrer una enumeración en C#?
- 20. Cómo recursivamente enumerar todos los archivos en un directorio en C#?
- 21. ¿Cómo debería recorrer una clase enum en C++ 11?
- 22. ¿Cómo recorrer un mapa de mapas en C++?
- 23. Eliminación recursiva de archivos y directorios en C#
- 24. ¿Cómo eliminar el directorio recursivamente?
- 25. CMD: ¿Cómo puedo eliminar recursivamente el atributo "Oculto" de archivos y directorios
- 26. Cómo imprimir una estructura C recursivamente en gdb
- 27. ¿Cómo puedo crear carpetas recursivamente en Delphi?
- 28. ¿Cómo puedo liberar bloqueos en Subversion recursivamente?
- 29. Cómo eliminar archivos recursivamente
- 30. ¿Cómo ejecutar un comando de lotes de Windows recursivamente?
directorios de desplazamiento corresponde OS-dependiente, por lo que es probable que tenga que decirnos qué sistema operativo que esté utilizando. Hay algunas librerías independientes del sistema operativo. Si está utilizando uno de ellos, necesitaremos saber a cuál dar una buena respuesta. –
¿Es esta una plataforma UNIX-y (Mac, etc.) o Windows, o algo completamente diferente? Muchas plataformas soportarán los estándares POSIX (http://robot.mbhs.edu/wordpress/2009/how-to-get-a-directory-listing-in-c-posix/), pero también generalmente tendrán su propia forma de hacerlo, especialmente Windows (FindFirstFile/FindNextFile) –
Todavía no estoy obteniendo esto para que funcione como yo quiero. FindFirstFile está dando como resultado el nombre del directorio en el que estoy, no es el primer archivo en el directorio si dejo el final de /. Si pongo el final/its me da un nombre de archivo raro (aaaaa-LIBVC ...).Además, las dos veces FindNextFile no devolverá ningún valor en absoluto – pmilb