⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dirinfo.c

📁 获取unix系统进程信息的功能
💻 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 + -