#include "tools_file.h"
#include "tools_err.h"
#include <time.h>
#include <stdio.h>
#include <stdarg.h>
long file_size(char *fname)
{
struct stat statbuf;
if(file_is_exist(fname)==True)
{
if (stat(fname,&statbuf) == -1)
{
return Error;
}
if(!(statbuf.st_mode & S_IFDIR))
{
return statbuf.st_size;
}
}
return Error;
}
void write_log(char *logname,char *mesg) /*写日志 */
{
time_t ti;
struct tm *now;
char str[512];
int fd;
time(&ti);
if((now=localtime(&ti))== NULL )
_exit(1);
sprintf(str,"%04d/%02d/%02d %02d:%02d:%02d:%s\n",now->tm_year+1900,now->tm_mon+1,
now->tm_mday,now->tm_hour,now->tm_min,now->tm_sec,mesg);
if((fd=open(logname,O_WRONLY|O_CREAT|O_APPEND,S_IREAD|S_IWRITE)) == -1 )
{
perror("不能打开日志文件!\n");
_exit(1);
}
write(fd,str,strlen(str));
close(fd);
}
int file_is_dir(char *name)
{
struct stat statbuf;
if(stat(name,&statbuf)==-1)
{
return False;
}
if(statbuf.st_mode & S_IFDIR)
{
return True;
}
else
return False;
}
int lock_reg(int fd,int cmd,int type,off_t offset,int whence,off_t len)
{
struct flock lock;
lock.l_type=type;
lock.l_start=offset;
lock.l_whence=whence;
lock.l_len=len;
return fcntl(fd,cmd,&lock);
}
pid_t lock_test(int fd,int type,off_t offset,int whence,off_t len)
{
struct flock lock;
lock.l_type=type;
lock.l_start=offset;
lock.l_whence=whence;
lock.l_len=len;
if(fcntl(fd,F_GETLK,&lock)<0)
err_sys("fcntl error");
if(lock.l_type==F_UNLCK)
return 0;
return lock.l_pid;
}
int get_file_line(char *fname)
{
int fd=-1;
char c=0;
int line=0;
if((fd=open(fname,O_RDONLY))!=-1)
{
while(read(fd,(void *)&c,sizeof(c))==sizeof(c))
{
if(c=='\n')
line++;
}
}
return line;
}
int file_is_exist(char *fname)
{
if(access(fname,F_OK)==0)
return True;
return False;
}
int file_is_read (char *fname)
{
if(access(fname,F_OK|R_OK)==0)
return True;
return False;
}
int file_is_write(char *fname)
{
if(access(fname,F_OK|W_OK)==0)
return True;
return False;
}
int file_is_exec(char *fname)
{
if(access(fname,F_OK|X_OK)==0)
return True;
return False;
}
int read_s(int fd,char *buf)
{
char c;
int i=0;
if(!fd)
return 0;
while(read(fd,(void *)&c,sizeof(c))==sizeof(c))
{
buf[i]=c;
i++;
if(c=='\n')
break;
}
buf[i]='\0';
return i;
}
char *add_file_sep(char *filename)
{
if(filename[strlen(filename)-1]!='/')
{
filename[strlen(filename)]='/';
filename[strlen(filename)+1]='\0';
}
return filename;
}
int copy_file(char *s_filename,char *t_filename)
{
char buf[8192];
int rd=0;
int s_fd=-1,t_fd=-1;
if((s_fd=open(s_filename,O_RDONLY))==-1)
{
perror("Open Source file error");
return False;
}
if((t_fd=open(t_filename,O_WRONLY|O_CREAT|O_TRUNC,FILE_MODE))==-1)
{
perror("Open Target file error:");
close(s_fd);
return False;
}
memset(buf,0,sizeof(buf));
while(1)
{
rd=read(s_fd,buf,sizeof(buf));
if(rd==-1)
{
close(t_fd);
close(s_fd);
return False;
}
if(rd==0)
break;
write(t_fd,(void *)buf,rd);
memset(buf,0,sizeof(buf));
}
close(t_fd);
close(s_fd);
return True;
}
int movefile(char *oldfilename,char *newfilename)
{
if(file_is_exist(oldfilename)==True)
{
if(rename(oldfilename,newfilename)==0)
return True;
else
return False;
}
return False;
}
int logprintf_zjf (const char *format, ...)
{
char filename[256],cdate[10],ctime[10];
time_t ti;
struct tm *now;
char str[512],str1[512];
int fd;
va_list ptr;
time(&ti);
if((now=localtime(&ti))== NULL )
{
return -1;
}
sprintf(filename,"%04d%02d%02d_%08d.log",now->tm_year+1900,now->tm_mon+1,now->tm_mday,getpid());
memset(str,0,sizeof(str));
memset(str1,0,sizeof(str1));
va_start (ptr, format);
vsprintf(str,format,ptr);
va_end (ptr);
sprintf(str1,"%04d/%02d/%02d %02d:%02d:%02d | %s\n",now->tm_year+1900,now->tm_mon+1,
now->tm_mday,now->tm_hour,now->tm_min,now->tm_sec,str);
if((fd=open(filename,O_WRONLY|O_CREAT|O_APPEND,S_IREAD|S_IWRITE)) == -1 )
{
perror("不能打开日志文件!\n");
return -1;
}
write(fd,str1,strlen(str1));
close(fd);
return 0;
}
int plogprintf (char *path,const char *format, ...)
{
char filename[256],cdate[10],ctime[10];
time_t ti;
struct tm *now;
char str[512],str1[512];
int fd;
va_list ptr;
time(&ti);
if((now=localtime(&ti))== NULL )
{
return -1;
}
sprintf(filename,"%s/%04d%02d%02d_%08d.log",path,now->tm_year+1900,now->tm_mon+1,now->tm_mday,getpid());
memset(str,0,sizeof(str));
memset(str1,0,sizeof(str1));
va_start (ptr, format);
vsprintf(str,format,ptr);
va_end (ptr);
sprintf(str1,"%04d/%02d/%02d %02d:%02d:%02d | %s\n",now->tm_year+1900,now->tm_mon+1,
now->tm_mday,now->tm_hour,now->tm_min,now->tm_sec,str);
if((fd=open(filename,O_WRONLY|O_CREAT|O_APPEND,S_IREAD|S_IWRITE)) == -1 )
{
perror("不能打开日志文件!\n");
return -1;
}
write(fd,str1,strlen(str1));
close(fd);
return 0;
}
int sprintfd(int fd,const char *format, ...)
{
va_list ptr;
char str[1024];
memset(str,0,sizeof(str));
va_start (ptr, format);
vsprintf(str,format,ptr);
va_end (ptr);
if(fd)
return write(fd,(void *)str,strlen(str));
return 0;
}