Why touching "d_name" makes calls to readdir() fail?
Posted
by Sarah Mani
on Stack Overflow
See other posts from Stack Overflow
or by Sarah Mani
Published on 2010-03-30T12:09:32Z
Indexed on
2010/03/30
12:13 UTC
Read the original article
Hit count: 449
Hi, I'm trying to write a little helper for Windows which eventually will accept a file extension as an argument and return the number of files of that kind in the current directory.
To do so, I'm reading the file entries in the directories and after getting the extension I'd like to convert it to lowercase to compare it with the yet-to-add specified argument.
When converting the extension to lowercase I found that touching even a duplicate string of the d_name
variable will cause a strange behaviour, like no more calls to readdir
are called.
Here is the code I'm using right now (the commented code is preliminary) and outputs for a given directory:
#include <ctype.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>
char * strrch(char *string, size_t elements, char character) {
char *reverse = string + elements;
while (--reverse != string)
if (*reverse == character)
return reverse;
return NULL;
}
void test(char *string) {
// Even being a duplicate will make it fail:
char *str = strdup(string);
printf("Strings: %s %s\n", string, str);
*str = 'a';
printf("Strings: %s %s\n", string, str);
//unsigned short int i = 0;
//for (; str[i] != '\0', str++; i++)
// str[i] = tolower((unsigned char) str[i]);
//puts(str);
}
int main(int argc, char **argv) {
DIR *directory;
struct dirent *element;
if (directory = opendir(".")) {
while (element = readdir(directory))
test(strrch(element->d_name, element->d_namlen, '.'));
closedir(directory);
puts(NULL);
} else
puts("Couldn't open the directory.\n");
}
Output without modifying the duplicate (modification and the second printf
call commented):
Strings: (null) (null)
Strings: . .
Strings: .exe .exe
Strings: .pdf .pdf
Strings: .c .c
Strings: .ini .ini
Strings: .pdf .pdf
Strings: .pdf .pdf
Strings: .pdf .pdf
Strings: .flac .flac
Strings: .FLAC .FLAC
Strings: .lnk .lnk
Strings: .URL .URL
Output of the same directory (with the code above, with the 2 printf
s):
Strings: (null) (null)
Is there anything wrong? Is it a compiler issue? I'm using GCC 4.4.3 in Windows (MinGW) right now.
Thank you very much for your help.
By the way, is there any other way to work with files and directories in a Windows environment not using the POSIX functions?
© Stack Overflow or respective owner