我有以下代码模仿ls:
#include <dirent.h>
#include <stdio.h>
char* dirent_type_to_str(unsigned char dirent_type) {
switch (dirent_type) {
case DT_DIR:
return "Dir ";
case DT_REG:
return "File";
}
printf("DEBUG: Unknown type %x\n", dirent_type);
return "Unk ";
}
int main(int argc, char** argv) {
char* dir_path = argc > 1 ? argv[1] : ".";
DIR* dir_stream = opendir(dir_path);
struct dirent* dirent_ptr;
while (dirent_ptr = readdir(dir_stream)) {
printf("%s %s\n", dirent_type_to_str(dirent_ptr->d_type), dirent_ptr->d_name);
}
closedir(dir_stream);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当我运行该程序时,它表示d_type与之关联.并且..未知:
james.ko@cslab1-20:~/Desktop/systems-11-02$ ./main …Run Code Online (Sandbox Code Playgroud) 我每天晚上都在处理一个大目录。每晚它会累积大约一百万个文件,其中一半.txt是我需要根据其内容移动到其他目录的文件。
每个.txt文件都是用管道分隔的,并且仅包含20条记录。记录6是包含我需要确定将文件移动到哪个目录的信息的记录。
记录示例:
A|CHNL_ID|4
Run Code Online (Sandbox Code Playgroud)
在这种情况下,文件将移至/out/4。
此脚本的处理速度为每小时80,000个文件。
关于如何加快速度有什么建议吗?
opendir(DIR, $dir) or die "$!\n";
while ( defined( my $txtFile = readdir DIR ) ) {
next if( $txtFile !~ /.txt$/ );
$cnt++;
local $/;
open my $fh, '<', $txtFile or die $!, $/;
my $data = <$fh>;
my ($channel) = $data =~ /A\|CHNL_ID\|(\d+)/i;
close($fh);
move ($txtFile, "$outDir/$channel") or die $!, $/;
}
closedir(DIR);
Run Code Online (Sandbox Code Playgroud) 我正在为我的公司编写一个简单的Web报告系统.我为index.php编写了一个脚本,该脚本获取"reports"目录中的文件列表,并自动创建指向该报告的链接.它工作正常,但我的问题是readdir()不断返回.和..目录指针以及目录的内容.是否有任何方法可以阻止此其他循环通过返回的数组并手动剥离它们?
以下是好奇的相关代码:
//Open the "reports" directory
$reportDir = opendir('reports');
//Loop through each file
while (false !== ($report = readdir($reportDir)))
{
//Convert the filename to a proper title format
$reportTitle = str_replace(array('_', '.php'), array(' ', ''), $report);
$reportTitle = strtolower($reportTitle);
$reportTitle = ucwords($reportTitle);
//Output link
echo "<a href=\"viewreport.php?" . $report . "\">$reportTitle</a><br />";
}
//Close the directory
closedir($reportDir);
Run Code Online (Sandbox Code Playgroud) 在此处发布我的代码片段。我正试图在调试中立足。
struct dirent *s_dirent;
char path[300];
....
bzero(path,300);
...
fd_dir = opendir(path);
while((s_dirent = readdir(fd_dir))!=NULL)
{
if(s_dirent->d_name[0] == '.')
continue;
else
break;
}
if(s_dirent == NULL)
{
if(closedir(fd_dir)!=0)
perror("Error on closedir");
}
else
{
if(closedir(fd_dir)!=0)/*Line number 249*/
perror("Error on closedir");
/*some comments*/
strcat(path,"/");
strcat(path,s_dirent->d_name);/*Line number 254*/
}
Run Code Online (Sandbox Code Playgroud)
Valgrind 输出:
==3287== Invalid read of size 1
==3287== at 0x40069E0: strcat (mc_replace_strmem.c:176)
==3287== by 0x804D6B4: online_bck (backup_manager.c:254)
==3287== by 0x8049F96: on_bck_beg (TxFS_manager.c:181)
==3287== by 0x8049818: handler (Reader.c:236)
==3287== by 0xBF5F18: start_thread (in …Run Code Online (Sandbox Code Playgroud) 很长一段时间以来,我一直在检查和使用这个程序而没有成功,希望你能帮助我.
想法是读取存储的目录c_Localpath并将读取的dirs复制到其中c_namesLocal以返回它们.
我在实施中做错了吗?程序打破了strcpy,我不知道为什么.
DIR* ptr_dir = opendir(c_Localpath);
char** c_namesLocal = calloc(1, 256);
size_t numElements = 0;
int returnCode =0;
struct dirent ptr_PrevDirEntry;
struct dirent* ptr_DirEntry = NULL;
returnCode = readdir_r(ptr_dir, &ptr_PrevDirEntry,
&ptr_DirEntry);
while ((returnCode ==0) && (ptr_DirEntry != NULL)) {
char* name = c_namesLocal[numElements];
strcpy(name, ptr_DirEntry->d_name);
ptr_PrevDirEntry = *ptr_DirEntry;
returnCode = readdir_r(ptr_dir, &ptr_PrevDirEntry,
&ptr_DirEntry);
numElements++;
c_namesLocal = realloc(c_namesLocal, 256 * numElements);
}
Run Code Online (Sandbox Code Playgroud) 我想要做的是在linux上编写一个C程序,如果有稀疏文件,应该在当前目录中检查,并且我还要打印已经代表文件中的间隙和数量的磁盘块数量磁盘块是0填充但占用磁盘空间.
到目前为止,我可以访问当前目录并打印文件
DIR *dirp;
struct dirent *dp;
Run Code Online (Sandbox Code Playgroud)
为了完成第二部分,我尝试使用稀疏文件,stat()但它似乎没有工作,因为我没有得到所需的结果,因为我希望.
那么,有人能告诉我如何使用稀疏文件做这个部分吗?
d_name[256]我对 struct dirent 定义中的使用感到困惑NAME_MAX。是否d_name[256]意味着文件名长度最多可以为 256 个字符?然后它还提到了 NAME_MAX(在底部引用)。所以,我的问题是NAME_MAX这里有什么关系以及我在哪里可以找到NAME_MAX价值和定义?
Inman readdir struct dirent定义如下。
struct dirent {\n ino_t d_ino; /* inode number */\n off_t d_off; /* not an offset; see NOTES */\n unsigned short d_reclen; /* length of this record */\n unsigned char d_type; /* type of file; not supported\n by all filesystem types */\n char d_name[256]; /* filename */\n};\nRun Code Online (Sandbox Code Playgroud)\n\n它还断言
\n\n\ndirent 结构中 POSIX.1\n 强制要求的唯一字段是: ,未指定大小,在终止空字节 ('\\0') …
我正在使用此脚本查看子文件夹的所有子文件夹和文件
function readfolder($dir)
{
global $tfile,$tdir;$i=0;$j=0;$myfiles;
$myfiles[][] = array();
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file=readdir($dh)) !== false) {
if (!is_dir($dir."\\".$file))
{
$tfile[$i]=$file;
$i++;
echo $dir."\\".$file." <b>File</b><br>";
}
else {
if (($file != ".") && ($file != "..")) {
$tdir[$j]=$file;
echo $dir."\\".$file." <b>Directory</b><br>";
readfolder($dir."\\".$file);
$j++;
}
}
}
closedir($dh);
}
}
}
readfolder(".");
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我如何使用filemtime函数(或其他),以便我可以按修改日期对子翻牌和文件进行排序?
我有一个名为 的allfiles文件夹,该文件夹中有一些文件,例如
1212-how-to-sddk-thosd.html
3454-go-to-dlkkl-sdf.html
0987-sfda-asf-fdf-12331.html
4789-how-to-fdaaf-65536.html
Run Code Online (Sandbox Code Playgroud)
我以前是scandir用来列出所有文件的,现在我需要通过关键字来查找文件,exampleto-dlkkl是关键字,我会得到文件3454-go-to-dlkkl-sdf.html。
Glob 似乎不起作用,并且 opendir 和 readdir 不起作用,有什么想法吗?
int indent = 0;
int listDir(const char* dirname){
DIR* dir;
struct dirent* d;
if(!(dir = opendir(dirname)))
return -1;
while((d = readdir(dir)) != NULL){
if(strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0 ){
continue;
}
else if(d->d_type != DT_DIR){ // Any except folders.
printf("%*s- %s:%ld\n", indent, "", d->d_name, d->d_ino);
}
else if(d->d_type == DT_DIR){ // Folders only
printf("%*s[%s]\n", indent, "", d->d_name);
char path[1024];
snprintf(path, sizeof(path), "%s/%s", dirname, d->d_name);
indent +=2;
listDir(path);
indent -=2;
}
Run Code Online (Sandbox Code Playgroud)
我需要输出是容器文件夹、文件和文件夹。文件夹应位于列表的末尾。例如,上面的输出应该是: