📄 dirinfo.c
字号:
#ifdef __cplusplus
extern "C" {
#endif
#ifdef WIN32
#include <windows.h>
#include <io.h>
#else
#include <dirent.h>
#include <unistd.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "dirinfo.h"
#include "common.h"
#include "utils.h"
#ifdef WIN32
int read_dir(const char *dirname, __int64 *size)
{
struct _finddata_t file;
intptr_t handle;
char path[COM_BUF_LEN];
char temp[COM_BUF_LEN];
sprintf(path, "%s\\*.*", dirname);
handle = _findfirst(path, &file);
if (handle == -1)
{
return -1;
}
else
{
if (file.attrib & _A_SUBDIR)
{
if (strcmp(file.name, ".") && strcmp(file.name, ".."))
{
sprintf(temp, "%s\\%s", dirname, file.name);
if (read_dir(temp, size) < 0)
{
_findclose(handle);
return -1;
}
}
}
else
{
sprintf(temp, "%s\\%s", dirname, file.name);
(*size) += file.size;
}
while (!(_findnext(handle, &file)))
{
if (file.attrib & _A_SUBDIR)
{
if (strcmp(file.name, ".") && strcmp(file.name, ".."))
{
sprintf(temp, "%s\\%s", dirname, file.name);
if (read_dir(temp, size) < 0)
{
_findclose(handle);
return -1;
}
}
}
else
{
sprintf(temp, "%s\\%s", dirname, file.name);
(*size) += file.size;
}
}
_findclose(handle);
}
return 0;
}
int GetDirDiskUsage(const char *dirname, float *percent, char *errbuf)
{
unsigned _int64 i64FreeBytesToCaller;
unsigned _int64 i64TotalBytes;
unsigned _int64 i64FreeBytes;
BOOL ret;
ret = GetDiskFreeSpaceEx(dirname,
(PULARGE_INTEGER)&i64FreeBytesToCaller,
(PULARGE_INTEGER)&i64TotalBytes,
(PULARGE_INTEGER)&i64FreeBytes);
if (!ret)
{
strcpy(errbuf, "1:invalid directory");
return -1;
}
*percent = 100*(float)(i64TotalBytes - i64FreeBytes)/(float)i64TotalBytes;
return 0;
}
int GetDirDiskSize(const char *dirname, char *buf, unsigned long len, char *errbuf)
{
unsigned _int64 i64FreeBytesToCaller;
unsigned _int64 i64TotalBytes;
unsigned _int64 i64FreeBytes;
BOOL ret;
ret = GetDiskFreeSpaceEx(dirname,
(PULARGE_INTEGER)&i64FreeBytesToCaller,
(PULARGE_INTEGER)&i64TotalBytes,
(PULARGE_INTEGER)&i64FreeBytes);
if (!ret)
{
strcpy(errbuf, "1:invalid directory");
return -1;
}
sprintf(buf, "%I64d", i64TotalBytes/1024);
return 0;
}
int GetDirDiskUsedSize(const char *dirname, char *buf, unsigned long len, char *errbuf)
{
unsigned _int64 i64FreeBytesToCaller;
unsigned _int64 i64TotalBytes;
unsigned _int64 i64FreeBytes;
BOOL ret;
ret = GetDiskFreeSpaceEx(dirname,
(PULARGE_INTEGER)&i64FreeBytesToCaller,
(PULARGE_INTEGER)&i64TotalBytes,
(PULARGE_INTEGER)&i64FreeBytes);
if (!ret)
{
strcpy(errbuf, "1:invalid directory");
return -1;
}
sprintf(buf, "%I64d", (i64TotalBytes - i64FreeBytes)/1024);
return 0;
}
int GetDirSize(const char *dirname, char *buf, unsigned long len, char *errbuf)
{
char szBuf[COM_BUF_LEN];
__int64 size = 0;
int ret;
if (!strchr(dirname, ':') || strlen(dirname) < 3)
{
strcpy(errbuf, "1:invalid directory");
return -1;
}
strcpy(szBuf, dirname);
if (szBuf[strlen(szBuf)-1] == '\\')
{
szBuf[strlen(szBuf)-1] = 0;
}
ret = read_dir(szBuf, &size);
if (ret == -1)
{
strcpy(errbuf, "1:directory permission denied");
return -1;
}
sprintf(buf, "%I64d", size/1024);
return 0;
}
int GetFileSysName(const char *dirname, char *buf, unsigned long len, char *errbuf)
{
if (!strchr(dirname, ':') || strlen(dirname) < 3)
{
strcpy(errbuf, "1:invalid directory");
return -1;
}
memset(buf, 0, len);
strncpy(buf, dirname, 3);
return 0;
}
#else
typedef union _tagUDir
{
struct dirent d;
char b[256];
} UDir;
#if defined(SOLARIS)
int read_dir(const char *dirname, long long *size)
{
DIR *dirp;
UDir u;
char temp[COM_BUF_LEN];
struct stat buf;
/* open the directory for reading */
dirp = opendir(dirname);
if (dirp == NULL)
{
return -1;
}
/* process all files in the directory... */
while (readdir_r(dirp, &u.d))
{
sprintf(temp, "%s/%s", dirname, u.d.d_name);
if (stat(temp, &buf) != 0)
{
closedir(dirp);
return -1;
}
/* only process normal files */
if (S_ISREG(buf.st_mode))
{
(*size) += buf.st_size;
}
/* recurse into subdirectories... */
if (S_ISDIR(buf.st_mode))
{
/* ignore current, parent and hidden directory entries */
if (strcmp(u.d.d_name, ".") && strcmp(u.d.d_name, ".."))
{
/* process the config directory */
if (read_dir(temp, size) < 0)
{
closedir(dirp);
return -1;
}
}
}
}
closedir(dirp);
return 0;
}
#else
int read_dir(const char *dirname, long long *size)
{
DIR *dirp;
UDir u;
struct dirent *p = NULL;
char temp[COM_BUF_LEN];
struct stat buf;
/* open the directory for reading */
dirp = opendir(dirname);
if (dirp == NULL)
{
return -1;
}
/* process all files in the directory... */
while (!readdir_r(dirp, &u.d, &p))
{
if (p == NULL)
{
break;
}
sprintf(temp, "%s/%s", dirname, p->d_name);
if (stat(temp, &buf) != 0)
{
closedir(dirp);
return -1;
}
/* only process normal files */
if (S_ISREG(buf.st_mode))
{
(*size) += buf.st_size;
}
/* recurse into subdirectories... */
if (S_ISDIR(buf.st_mode))
{
/* ignore current, parent and hidden directory entries */
if (strcmp(p->d_name, ".") && strcmp(p->d_name, ".."))
{
/* process the config directory */
if (read_dir(temp, size) < 0)
{
closedir(dirp);
return -1;
}
}
}
}
closedir(dirp);
return 0;
}
#endif
int GetDirDiskUsage(const char *dirname, float *percent, char *errbuf)
{
char szBuf[MIN_BUF_LEN];
char szCmd[MIN_BUF_LEN];
int ret;
#if defined(AIX)
sprintf(szCmd, "df -k %s|awk 'NR>1{printf \"%%.02f\", 100*($2-$3)/$2;}'", dirname);
#else
sprintf(szCmd, "df -k %s|awk 'NR>1{printf \"%%.02f\", 100*$3/$2;}'", dirname);
#endif
ret = my_system(szCmd, DEFAULT_COMMAND_TIMEOUT, szBuf, MIN_BUF_LEN);
if (ret != 0)
{
strcpy(errbuf, "2:my_system() error");
return -1;
}
trim_strLR(szBuf, szBuf);
if (strlen(szBuf) == 0)
{
strcpy(errbuf, "1:invalid directory");
return -1;
}
*percent = atof(szBuf);
return 0;
}
int GetDirDiskSize(const char *dirname, char *buf, unsigned long len, char *errbuf)
{
char szCmd[MIN_BUF_LEN];
int ret;
sprintf(szCmd, "df -k %s|awk 'NR>1{print $2;}'", dirname);
ret = my_system(szCmd, DEFAULT_COMMAND_TIMEOUT, buf, len);
if (ret != 0)
{
strcpy(errbuf, "2:my_system() error");
return -1;
}
trim_strLR(buf, buf);
if (strlen(buf) == 0)
{
strcpy(errbuf, "1:invalid directory");
return -1;
}
return 0;
}
int GetDirDiskUsedSize(const char *dirname, char *buf, unsigned long len, char *errbuf)
{
char szCmd[MIN_BUF_LEN];
int ret;
#if defined(AIX)
sprintf(szCmd, "df -k %s|awk 'NR>1{print $2-$3;}'", dirname);
#else
sprintf(szCmd, "df -k %s|awk 'NR>1{print $3;}'", dirname);
#endif
ret = my_system(szCmd, DEFAULT_COMMAND_TIMEOUT, buf, len);
if (ret != 0)
{
strcpy(errbuf, "2:my_system() error");
return -1;
}
trim_strLR(buf, buf);
if (strlen(buf) == 0)
{
strcpy(errbuf, "1:invalid directory");
return -1;
}
return 0;
}
int GetDirSize(const char *dirname, char *buf, unsigned long len, char *errbuf)
{
char szBuf[COM_BUF_LEN];
long long size = 0;
int ret;
strcpy(szBuf, dirname);
if (szBuf[strlen(szBuf)-1] == '\\')
{
szBuf[strlen(szBuf)-1] = 0;
}
ret = read_dir(szBuf, &size);
if (ret == -1)
{
strcpy(errbuf, "1:directory permission denied");
return -1;
}
sprintf(buf, "%lld", size/1024);
return 0;
}
int GetFileSysName(const char *dirname, char *buf, unsigned long len, char *errbuf)
{
char szCmd[MIN_BUF_LEN];
int ret;
sprintf(szCmd, "df -k %s|awk 'NR>1{print $1;}'", dirname);
ret = my_system(szCmd, DEFAULT_COMMAND_TIMEOUT, buf, len);
if (ret != 0)
{
strcpy(errbuf, "2:my_system() error");
return -1;
}
trim_strLR(buf, buf);
if (strlen(buf) == 0)
{
strcpy(errbuf, "1:invalid directory");
return -1;
}
return 0;
}
#endif
#ifdef __cplusplus
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -