首页
社区
课程
招聘
[原创]windows下的tail,附代码-添加 f选项,看5楼
发表于: 2007-6-16 08:07 7839

[原创]windows下的tail,附代码-添加 f选项,看5楼

2007-6-16 08:07
7839

//                                                                           
//  作者:Aker Lee  mailtoljm#163。com                                       
//  标题:windows下的tail                                                   
//  日期:2007-6-16 7:16                                                     
//                                                                           
//  这几天,总要查看大文件,每次用ultraedit打开文件,但是还是很慢,         
//  非常怀念linux下的tail,到网上搜索了一下,发现有unixutils里面有tail.      
//  但是从sourceforge上下了n久,都连不上;另外发现codeproject上面有个gui版的
//  不喜欢,而且那个是mfc写得。                                             
//  想想还是自己动手,丰衣足食                                               
//  所以就有了这个小工具,希望大家喜欢。有时候应该比较有用:)                 
//                                                                           
//  思路很简单,打开文件读到最后,往回读,读到'\n',行计数加一,            
//  直到满足要读的行数,确定位置,输出........                              
//                                                                           
//  编译环境:winxpsp2 + cl 13.10.3077 + link 7.10                           
//                                                                           
//  问题:读大文件(2G)不支持,不过一般应该够用了,如果要用的话,自己改下        
//        如果还有其他问题,请mailme:)                                       
//                                                                           
//  改进:如果想要多功能的tail,如从文件某个位置开始读一定行数               
//        以16进制,字符等显示........                                       
//                                                                           
//  使用方法:tail 文件名 [最后的行数]                                       
//            最后的行数为可选项,默认最后10行                              
//                                                                           
//  代码随便修改,最好给我发一份:)                                          
//                                                                           


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
2
不是吧,每人给点评论的阿,我觉得这个还是很有用的阿,比如我们看日志,常常要看最后几行,要是打开文件就好麻烦的。在console下直接
tail 文件名 n
就可以看最后n行的数据。
2007-6-16 20:13
0
雪    币: 234
活跃值: (104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
unix下的tail还有一个经常用的选项: -f

希望能支持。
例:
tail -f logfile
2007-6-18 09:48
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
不错,支持一下。
2007-6-18 10:23
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
5
有时间我将-f 添上,哎上午还想删掉这贴的;(
2007-6-18 10:59
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
6
修改了下,不过有点糙,将就用吧
tail 文件名 行数 f

//----------------------------------------------------------------------------
//                                                                           |
//  作者:Aker Lee  mailtoljm#163。com                                       |
//  标题:windows下的tail                                                    |
//  日期:2007-6-16 7:16                                                     |
//  修改:2007-6-18 11:41  添加f,可以实时跟踪修改,                         |
//                         谁自己修改下,可以更友好                          |
//                                                                           |
//  这几天,总要查看大文件,每次用ultraedit打开文件,但是还是很慢,          |
//  非常怀念linux下的tail,到网上搜索了一下,发现有unixutils里面有tail.      |
//  但是从sourceforge上下了n久,都连不上;另外发现codeproject上面有个gui版的 |
//  不喜欢,而且那个是mfc写得。                                              |
//  想想还是自己动手,丰衣足食                                               |
//  所以就有了这个小工具,希望大家喜欢。有时候应该比较有用:)                 |
//                                                                           |
//  思路很简单,打开文件读到最后,往回读,读到'\n',行计数加一,             |
//  直到满足要读的行数,确定位置,输出........                               |
//                                                                           |
//  编译环境:winxpsp2 + cl 13.10.3077 + link 7.10                           |
//                                                                           |
//  问题:读大文件(2G)不支持,不过一般应该够用了,如果要用的话,自己改下        |
//        如果还有其他问题,请mailme:)                                       |
//                                                                           |
//  改进:如果想要多功能的tail,如从文件某个位置开始读一定行数               |
//        以16进制,字符等显示........                                       |
//                                                                           |
//  使用方法:tail 文件名 [最后的行数]                                       |
//            最后的行数为可选项,默认最后10行                               |
//                                                                           |
//  代码随便修改,最好给我发一份:)                                           |
//                                                                           |
//----------------------------------------------------------------------------

//////////////////////////////////////////////////////////////////////////////
// 头文件
#include <stdio.h>
#include <assert.h>
#include <windows.h>

////////////////////////////////////////////////////////////////////////////////////////////////
#pragma comment(lib,"advapi32")
#pragma comment(linker, "/align:0x1000") 
// 如果觉得文件大的话,谁把printf换成wsprintf和writeconsole
////////////////////////////////////////////////////////////////////////////////////////////////
// 全局变量

////////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////////
// 函数定义
// taken from msdn SetFilePointer :)
__int64 myFileSeek (HANDLE hf, __int64 distance, DWORD MoveMethod)
{
   LARGE_INTEGER li;
   li.QuadPart = distance;
   li.LowPart = SetFilePointer (hf, li.LowPart, &li.HighPart, MoveMethod);
   if (li.LowPart == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR)
   {    // vc6 要修改INVALID_SET_FILE_POINTER为((DWORD)-1)
        // WinBase.h:#define INVALID_SET_FILE_POINTER ((DWORD)-1)
      li.QuadPart = -1;
   }
   return li.QuadPart;
}

void MyCloseFile(HANDLE hFile)
{
    BOOL    bFlag;                  // a result holder
    bFlag = CloseHandle(hFile);     // close the file

    if(!bFlag) 
    {
        printf("[-] Error # %ld occurred closing the file!\n",
           GetLastError());
    }    
}
////////////////////////////////////////////////////////////////////////////////////////////////
int gettail(char *filename,DWORD nlastlines, int bFollowFlag)
{
    // 局部变量
	HANDLE  hFile;
    DWORD   dwFileSize,dwOldFileSize,iterator,bytes_read,lines = 0;
#define BUFFSIZE 1024                // the size of the memory to examine at any one time
	char		buf[BUFFSIZE];

    // 函数参数分析
	assert(filename != NULL);
    assert(nlastlines > 0);
    
    // 函数动作
    // 打开文件
	hFile = CreateFile(	filename, GENERIC_READ,
		FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE ,	NULL,
			OPEN_EXISTING,	FILE_ATTRIBUTE_NORMAL,	NULL);
	if(hFile == INVALID_HANDLE_VALUE)
	{
        printf("[-] Error # %ld occurred opening %s!\n", GetLastError(),filename);
		return -1;
	}

    // 获取文件大小
    dwFileSize = iterator = GetFileSize(hFile,  NULL);
	dwOldFileSize = dwFileSize;
    // 寻找最后nlastlines行的初始位置
	while(lines < nlastlines && iterator > 0)
	{
		iterator--;
		myFileSeek(hFile, iterator, FILE_BEGIN);
		if(!ReadFile(hFile, buf, 1, &bytes_read, NULL))
		{
            printf("[-] Error # %ld occurred reading %s!\n", GetLastError(),filename);
			MyCloseFile(hFile);
			return -1;
		}

		if(buf[0] == '\n')  lines++;
	}
	// 如果已经遍历到文件头,重设文件开始位置
	if(iterator == 0) myFileSeek(hFile, 0, FILE_BEGIN);
    
    // 读取到文件末尾并输出
	do{
		if(!ReadFile(hFile, buf, BUFFSIZE-1, &bytes_read, NULL))
		{
            printf("[-] Error # %ld occurred reading %s!\n", GetLastError(),filename);
			MyCloseFile(hFile);
			return -1;
		}
		iterator += bytes_read;
		buf[bytes_read] = '\0';

		printf("%s", buf);
	}while(bytes_read >0 );
	
#define SLEEPTIME 1000
    do {
        dwFileSize = iterator = GetFileSize(hFile,  NULL);
        if(dwFileSize > dwOldFileSize) 
        {        
            myFileSeek(hFile, dwOldFileSize, FILE_BEGIN);
                // 读取到文件末尾并输出
        	do{
        		if(!ReadFile(hFile, buf, BUFFSIZE-1, &bytes_read, NULL))
        		{
                    printf("[-] Error # %ld occurred reading %s!\n", GetLastError(),filename);
        			MyCloseFile(hFile);
        			return -1;
        		}
        		iterator += bytes_read;
        		buf[bytes_read] = '\0';
        
        		printf("%s", buf);
        	}while(bytes_read >0 );
        }
        dwOldFileSize = dwFileSize;
        Sleep(SLEEPTIME);    
    }while(bFollowFlag)
    
    
    MyCloseFile(hFile);
    // 返回值
    return 0;
}

//////////////////////////////////////////////////////////////////////////////
// 入口点
int main(int argc, char* argv[])
{
    // 局部变量
    DWORD nlastlines = 10;          // 默认最后10行
    char *szFileName = strdup(argv[1]);
    int  bFollowFlag = 0;
    // 参数分析
    // 1命令行分析
    if (argc < 2)
    {
    	    printf("[+] Tail 0.90 created by Aker Lee <mailtoljm#163.com>\n");
            printf("[-] Usage: tail {file name} [number of lines] [f]\n"
                   "[-]        Display last 10 lines by default\n");
            return -1;
    }
    else if(argc >= 3)
    {
        nlastlines = (DWORD)atoi(argv[2]);
    }
    if(argc == 4 && argv[3][0] == 'f') bFollowFlag = 1;   // 
    // 函数动作
    gettail(szFileName,nlastlines,bFollowFlag);
    
    free(szFileName);
    // 返回值
	return 0;
}
//////////////////////////////////////////////////////////////////////////////

2007-6-18 11:42
0
游客
登录 | 注册 方可回帖
返回
//