ls的实现

#include <sys/types.h>
#include <dirent.h>
#include "ourhdr.h"

int
main(int argc, char *argv[])
{
DIR *dp;
struct dirent *dirp;

if (argc != 2)
err_quit("a single argument (the directory name) is required");

if ( (dp = opendir(argv[1])) == NULL)
err_sys("can't open %s", argv[1]);

while ( (dirp = readdir(dp)) != NULL)
printf("%s\n", dirp->d_name);

closedir(dp);
exit(0);
}

以上是在UNIX上ls的实现 有点类似的地方 希望对楼主有用

chinabig 03-04-16 17:30
如何搜索一个目录下的文件?

如何搜索一个目录下的文件?
用readdir()可以读出一个目录下的文件。如:
readdir(dirp); // 读出一个文件信息
 readdir(dirp); // 读出下一个文件信息

这样可以从第一个文件,顺序地读到最后一个文件。我想问的是,当我要逆序地读出一个文件
时,有没有函数可以做到?例如我当前已读了六个文件,现在又想回过头来读第三个文件,要怎
么做?
是不是只能这么做:先把该目录下的文件全部读一遍,通过telldir()得到各文件的在目录中的偏
移量(类型为off_t),再用一个数组保存下来。然后再用seekdir()来定位?
感觉这样做很不智能。
有没有函数可以直接定位?就像读一个文件中数据那样,通过fseek()可以定位到一个绝对地址或

自由狼-台风 03-04-17 19:34
我得到一个例子,不好,但是解了我的燃眉之急,希望对你有帮助。

它调用“ls -AlF”对目录列表,结果不输出到屏幕,而存放于als[1000000]。各文件名之间有“\n”分隔。把目标文件名字符和als[1000000]的各文件名对照,就可以了。这个数组还能提供权限和文件种类的信息。
代码:
#include <stdio.h>
main()
{
FILE *afmp;
char als[1000000];
char cmd[8];
char line[1000];
char path[1000];

char import[1000]="/root";//适当修改,可改为手工输入
int i1,i2,i3,i4;

for(i4=0;import[i4]!=0;i4++);
path[i4]=import[i4];

//scanf("%s",path);
sprintf(cmd,"ls -alF %s",path);
afmp=popen(cmd,"r");
if(!afmp)
{
printf("error!\n");
exit(1);
}

for(i3=0;i3<1000000;i3++)
als[i3]=0;
i3=0;
while(fgets(line,sizeof(line),afmp))
{
for(i4=0;line[i4]!='\n';i4++)
{
als[i3]=line[i4];
i3++;
}
als[i3]='\"';i3++;
als[i3]='\n';i3++;
}
printf("%s",als);
pclose(afmp);
}

自由狼-台风 03-04-17 19:39
如果真正有用,请说一声。

colored 03-04-23 19:23
你可以自己编一函数

以后直接调用智能了!:P
所有的函数都是编出来的,自己动手好处多多

viper 03-04-23 23:37
自由郎-台风的做法是可以工作的,一次性使用的话,没事儿。如果你的程序需要经常使用这个功能,还是自己做一个好一点的吧!

chinabig 03-04-24 10:10
我已编了一个,谢谢大家

用c语言编写在硬盘上搜索指定文件的程序
悬赏分:15 - 解决时间:2007-6-12 21:11
搜索每个硬盘上指定文件名的文件,并列出该文件的详细信息,如大小、路径、创建日期等。C语言环境下的代码。
急等,谢诸位大虾。
提问者: agul_333 - 秀才 三级
最佳答案
以前曾经写过这样一个非图形界面的C程序。现在找出来供参考。说明:
1. 文件大小, 只输出了低4字节, 也就是说大于4G的文件其大小显然是不对的. 因为我没有大于4G的文件, 所以未修改.
2. 没有排序功能.

用法:
1. 拷贝下来保存成 FFile.c
2. 用32位编译器(如GCC, VC)编译成控制台程序。我用GCC编译成FFile.exe才4K大小。
3. 在命令提示符窗口下输入命令:
FFile -文件名

例如:
FFile -a*.c 所有硬盘下a*.c; 注意文件名前要加横线.

在我的机器上运行结果为:

F:\MyCode>ffile -a*.c
2000.12.16 07:07:42 1601 Bytes, File=G:\MYPROJ\TryDBF\Misc\ADDDBF.C
1998.12.14 21:13:28 13626 Bytes, File=G:\MYPROJ\TRY\AUTOMAIL.C
2000.12.15 12:58:42 1585 Bytes, File=G:\MYPROJ\TRY\dbf\adddbf.c
2000.11.21 13:32:52 1922 Bytes, File=G:\MYPROJ\TRY\Prv\analod.c
- Found 4 file(s) match with G:\a*.c.
2005.11.01 15:57:52 692 Bytes, File=H:\work\AllSwf.c
2005.09.15 11:00:54 817 Bytes, File=H:\work\ifon\AskMac.c
- Found 2 file(s) match with H:\a*.c.

源程序如下:

#include <stdio.h>

/**************
2005.08.25 Created to find file in all hard disks.
*****************/

#include <windows.h>

static int count = 0;

static char * GetFileTimeString(FILETIME *pt)
{
static char szFileTime[24];
SYSTEMTIME st;
FILETIME lt;
FileTimeToLocalFileTime(pt, <);
FileTimeToSystemTime(<, &st);
sprintf(szFileTime, "%04d.%02d.%02d %02d:%02d:%02d",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
return szFileTime;
}

static void doThisFile(WIN32_FIND_DATA *pfd, char *path)
{
printf("%s %10u Bytes, File=%s\\%s\n", // 0xffffffff = 4294967295
GetFileTimeString(&(pfd->ftLastWriteTime)), pfd->nFileSizeLow, path, pfd->cFileName);
++count;
}

static void FindFiles(char *path, char *fname)
{
WIN32_FIND_DATA fd;
HANDLE handle;
char fp[256], subpath[256];

sprintf(fp, "%s\\%s", path, fname);
handle = FindFirstFile(fp, &fd);
if (handle != INVALID_HANDLE_VALUE) {
if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
doThisFile(&fd, path);
}
while (FindNextFile(handle, &fd)) {
if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
doThisFile(&fd, path);
}
}
FindClose(handle);
}
//**** Find All subdirectories …………………..
sprintf(fp, "%s\\*.*", path);
handle = FindFirstFile(fp, &fd);
if (handle != INVALID_HANDLE_VALUE) {
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (fd.cFileName[0]!='.') {
sprintf(subpath, "%s\\%s", path, fd.cFileName);
FindFiles(subpath, fname);
}
}
while (FindNextFile(handle, &fd)) {
if (fd.cFileName[0]=='.') continue;
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
sprintf(subpath, "%s\\%s", path, fd.cFileName);
FindFiles(subpath, fname);
}
}
FindClose(handle);
}
return;
}

static void DoPath(char *path, char *pattern)
{
count = 0;
FindFiles(path, pattern);
if (count) printf("—- Found %d file(s) match with %s\\%s.\n", count, path, pattern);
}

int main(int argc, char *argv[])
{
int i;
BYTE *cp, pattern[20], tbuf[240];
if (argc==1 || *argv[1]!='-') printf("Usage: FFile -Filepattern\n");
else {
strcpy(pattern, ++argv[1]);
GetLogicalDriveStrings(240, tbuf);
for (cp=tbuf; *cp; cp+=4) {
*cp &= 0x5f;
if (GetDriveType(cp)==3) {
cp[2] = '\0'; // C:\ => C:
DoPath(cp, pattern);
}
}
}
return 0;
}

FindFirstFile/FindNextFileTop
3 楼lostgdi731(O_O)回复于 2003-12-18 19:24:49 得分 30

参数说明:
pszDir 为你要指定查找的目录。例如D:\\games\\ (注意是\而不是\\)
SpszDir 为指定把查找目录下的所有文件的信息(文件名,和文件大少)。例如D:\\games.lis
#define MYMAX_PATH 192
Dir_A_S(LPCSTR pszDir,LPCSTR SpszDir) //遍历文件夹函数
{
WIN32_FIND_DATA ffd ;
char szDirFile[MYMAX_PATH];
//int i;
FileInfo fileinfo;

CString filename;

CFile fsl; //确保SpszDir文件的存在
FILE* fp=NULL;
if((fp=fopen(SpszDir,"r"))==NULL)
{fsl.Open(SpszDir, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary|CFile::shareDenyNone);fsl.Close();fsl.Open(SpszDir,CFile::modeWrite | CFile::typeBinary | CFile::shareDenyNone);}
else {fsl.Open(SpszDir,CFile::modeWrite | CFile::typeBinary | CFile::shareDenyNone);fsl.Seek(0,CFile::end);fclose(fp);}

sprintf(szDirFile,"%s*",pszDir);
HANDLE hFind = FindFirstFile(szDirFile,&ffd);
if (hFind != INVALID_HANDLE_VALUE)
{
char szDir[MYMAX_PATH];
if(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&
strcmp(ffd.cFileName,".") &&
strcmp(ffd.cFileName,".."))
{//确定找到一个目录并且不为 . 或 ..
sprintf(szDir,"%s%s\\",pszDir,ffd.cFileName);

Dir_A_S(szDir,SpszDir);
}
while(FindNextFile(hFind,&ffd))
{
if(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&
strcmp(ffd.cFileName,".") &&
strcmp(ffd.cFileName,".."))
{//确定找到一个目录并且不为 . 或 ..
sprintf(szDir,"%s%s\\",pszDir,ffd.cFileName);

//printf("%s\n",szDir);

Dir_A_S(szDir,SpszDir);

}
if(!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&
strcmp(ffd.cFileName,".") &&
strcmp(ffd.cFileName,"..")) &&
strcmp(ffd.cFileName,".") &&
strcmp(ffd.cFileName,".."))
{

sprintf(szDir,"%s%s",pszDir,ffd.cFileName);
memset(fileinfo.filename, '\0', MYMAX_PATH );
filename=szDir;
filename.Replace("\\","\\\\");
strcpy(fileinfo.filename,filename);
fileinfo.filelonghigh=ffd.nFileSizeHigh;
fileinfo.filelonglow=ffd.nFileSizeLow;
fsl.Write(&fileinfo,sizeof(FileInfo));
}

}
FindClose(hFind);
fsl.Close();

}

}
还不明白的话发消息给我吧。Top
4 楼pengcar()回复于 2003-12-18 22:14:15 得分 30

void CRecDlg::BrowseFile(CString strFile)
{
CFileFind ff;
CString szDir = strFile;

if(szDir.Right(1) != "\\")
szDir += "\\";

szDir += "*.*";

BOOL res = ff.FindFile(szDir);
while(res)
{
res = ff.FindNextFile();
CString strPath = ff.GetFilePath();
CString strTitle = ff.GetFileTitle();
if(ff.IsDirectory() && !ff.IsDots())
{
BrowseFile(strPath);
}
else if(!ff.IsDirectory() && !ff.IsDots())
{
CString strPath;
strPath = ff.GetFilePath();

}
}
ff.Close();
}Top
5 楼homor(我)回复于 2003-12-19 00:52:31 得分 0

多谢各位的回答,明天按照大侠们说的去试试,然后回来结贴 ^_^Top
6 楼flinming(flinming)回复于 2003-12-19 08:34:16 得分 0

upTop
7 楼liuxianzhi(碧渊)回复于 2003-12-19 17:20:33 得分 30

呵呵~~
看看我的递归算法:
//如果sPath为目录,就继续检查他的是否仍然有下一级子目录;
void CConvertWord2PDFDlg::AddFolder(LPCTSTR Path, int nType)
{
CString sPath=Path;
AddFiles(Path, nType);
sPath+="*.*";
CFileFind ff;
BOOL bWorking = ff.FindFile(sPath);
if (!bWorking) return;

while (bWorking)
{
bWorking = ff.FindNextFile();

if (ff.IsDots())
continue;

if (ff.IsDirectory()){
CString str=ff.GetFilePath();
str+='\\';
AddFolder(str, nType);
}
}
}

//如果sPath为文件,就自动搜索是否符合后缀要求,符合就添加到列表中; 刘贤志01、2、22
void CConvertWord2PDFDlg::AddFiles(CString sPath, int nType)
{
CStringArray Type;
Type.RemoveAll();
if(nType==1)
{
Type.Add ("*.rtf");
}
else if(nType==2)
{
Type.Add ("*.doc");
}
else if(nType==3)
{
Type.Add ("*.html");
Type.Add ("*.htm");
}

int size=Type.GetSize();
for(int i=0;i<size;i++){
CString TmpPath;
TmpPath=sPath;
TmpPath+=Type[i];//加上对文件类型的判断
CFileFind ff;
BOOL bWorking = ff.FindFile(TmpPath);
if (!bWorking && i<size ) continue;
else if(!bWorking && i>=size) return;

while (bWorking)
{
bWorking = ff.FindNextFile();

if (ff.IsDots())
continue;

if (ff.IsDirectory()){
CString str=ff.GetFilePath();
}
if (!ff.IsDirectory()){
AddFiletoList(ff.GetFilePath());
}
}
}
}
Top
8 楼homor(我)回复于 2003-12-20 01:49:51 得分 0
问题解决,多谢大家的帮助!

WinCE中如何查找文件,并且删除一个目录下的所有文件 CSDN Blog推出文章指数概念,文章指数是对Blog文章综合评分后推算出的,综合评分项分别是该文章的点击量,回复次数,被网摘收录数量,文章长度和文章类型;满分100,每月更新一次。
void CDirectoryAndFileTestDlg::FindFiles()
{
WIN32_FIND_DATA FileData; // Data structure describes the file found
HANDLE hSearch; // Search handle returned by FindFirstFile
TCHAR szMsg[100]; // String to store the error message
TCHAR szNewPath[MAX_PATH]; // Name and path of the file copied
TCHAR szDirPath[] = TEXT("\\tmp");

BOOL bFinished = FALSE;
//开始在tmp目录下查找.exe
hSearch = FindFirstFile (TEXT("\\tmp\\*.exe"), &FileData);
if (hSearch == INVALID_HANDLE_VALUE)
{
wsprintf (szMsg, TEXT("No .exe files found."));
return;
}
while (!bFinished) {
//删除文件
TCHAR pFileName[MAX_PATH];
for (int i=0;i<MAX_PATH;i++) {
pFileName[i]=_T('');
}
lstrcat(pFileName,TEXT("\\tmp\\"));
lstrcat(pFileName,FileData.cFileName);
TRY
{
CFile::Remove(pFileName);
}
CATCH (CFileException, pEx)
{
#ifdef _DEBUG
afxDump « "File " « pFileName « " cannot be removed\n";
#endif
}
END_CATCH

for (int j=0;j<MAX_PATH;j++) {
pFileName[j]=_T('');
}
//查找下一个文件
if (!FindNextFile (hSearch, &FileData))
{
bFinished = TRUE;

if (GetLastError () == ERROR_NO_MORE_FILES)
{
wsprintf (szMsg, TEXT("文件查找完毕."));
}
else
{
wsprintf (szMsg, TEXT("没有找到下一个文件."));
}
}
}
//关闭文件查找句柄.
if (!FindClose (hSearch))
{
wsprintf (szMsg, TEXT("Unable to close search handle."));
}
}

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License