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

📄 file.cpp

📁 查看文件可被那些用户使用,然后列出清单。进行查询。
💻 CPP
字号:
#include <windows.h>
#include <commctrl.h>
#include <tchar.h>
#include <stdio.h>

#include "AccessEnum.h"
#include "resource.h"
#include "resizer.h"


void CompareUsers( HWND hWnd, const TCHAR * share, CUser * aUser, CUser * bUser, void (*callback)( HWND hWnd, const TCHAR * format, ... ), const TCHAR * type )
{
	// iterate over users
	for (;;)  {
		if ( aUser == NULL  &&  bUser == NULL )
			break;
		int diff = aUser && bUser ? _tcsicmp( aUser->m_Acct, bUser->m_Acct ) : aUser ? -1 : 1;

		if ( diff < 0 )  {
			// item deleted
			callback( hWnd, _T("%s lost %s access to %s"), type ? aUser->m_Acct : _T("Everyone"), type ? type : aUser->m_Acct, share );
			aUser = aUser->m_Next;
			continue;
		}
		
		if ( diff > 0 )  {
			// item added
			callback( hWnd, _T("%s gained %s access %s"), type ? bUser->m_Acct : _T("Everyone"), type ? type : bUser->m_Acct, share );
			bUser = bUser->m_Next;
			continue;
		}

		aUser = aUser->m_Next;
		bUser = bUser->m_Next;
	}
}


void CompareShares( HWND hWnd, CShare * aShare, CShare * bShare, void (*callback)( HWND hWnd, const TCHAR * format, ... ) )
{
	// iterate over shares
	for (;;)  {

#if 0
		// skip shares that we couldn't access permissions for
		while ( aShare  &&  _tcschr( aShare->m_path+2, '\\' ) == NULL )
			aShare = aShare->m_Next;
		while ( bShare  &&  _tcschr( bShare->m_path+2, '\\' ) == NULL )
			bShare = bShare->m_Next;
#endif

		if ( aShare == NULL  &&  bShare == NULL )
			break;
		int diff = aShare && bShare ? _tcsicmp( aShare->m_path, bShare->m_path ) : aShare ? -1 : 1;

		if ( diff < 0 )  {
			// item deleted
			callback( hWnd, _T("%s removed"), aShare->m_path );
			aShare = aShare->m_Next;
			continue;
		}
		
		if ( diff > 0 )  {
			// item added
			callback( hWnd, _T("%s added"), bShare->m_path );
			bShare = bShare->m_Next;
			continue;
		}
		
		CompareUsers( hWnd, aShare->m_path, aShare->m_OtherRead,	bShare->m_OtherRead,	callback, _T("Read") );
		CompareUsers( hWnd, aShare->m_path, aShare->m_OtherWrite,	bShare->m_OtherWrite,	callback, _T("Write") );
		CompareUsers( hWnd, aShare->m_path, aShare->m_deny,			bShare->m_deny,			callback, _T("Deny") );

		aShare = aShare->m_Next;
		bShare = bShare->m_Next;
	}
}


// Split a CSV line into fields
int Split( TCHAR * line, TCHAR ** fields, TCHAR delim )
{
	TCHAR ** start = fields;
	TCHAR * dst = line;
	TCHAR * src = line;
	bool	got	= false;

	while ( *src )  {
		if ( *src == delim )  {
			if ( !got )
				*fields++ = dst;
			*dst++ = 0;
			got = false;
		} else if ( *src != '"' )  {
			if ( !got )
				*fields++ = dst, got = true;
			*dst++ = *src;
		} else {
			++src;
			while ( *src != '"' )  {
				if ( *src == 0 )
					goto abort;
				if ( !got )
					*fields++ = dst, got = true;
				*dst++ = *src++;
			}
		}
		++src;
	}
	if ( !got )
		*fields++ = dst;
abort:
	*fields = NULL;
	*dst = 0;
	return fields - start;
}


CShare * ImportFile( const TCHAR * path )
{
	CShare	*	list	= NULL;
	FILE	*	fp		= _tfopen( path, _T("rb") );
	DWORD		line	= 0;
	if ( fp == NULL )
		return NULL;

	// Mark file as unicode
#if UNICODE
	WORD uni = _fgettc( fp );
	if ( uni != 0xFEFF )  {
		fclose( fp );
		return NULL;
	}
#endif

	TCHAR	Line[ 5 * MAX_TEXT ];
	for (;;)  {
		// read a line
		for ( int pos = 0; pos < sizeof Line/sizeof Line[0] - 1; ++pos )  {
			int ch = _fgettc( fp );
			if ( ch == _TEOF )  {
				fclose( fp );
				return list;
			}
			Line[pos] = ch;
			if ( pos >= 2  &&  Line[pos] == '\n' && Line[pos-1] == '\r' )  {
				++pos;
				break;
			}
		}
		Line[pos] = 0;

		++line;

		// remove trailing white space (particularly newlines)
		TCHAR	*	end = _tcschr( Line, 0 );
		while ( end > Line  &&  iswspace( end[-1] ) )
			*--end = 0;

		TCHAR	*	fields[ 20 ];
		int			cnt = Split( Line, fields, 0x9 );

		if ( cnt == 4 )  {
			CShare * item = new CShare( fields[0], fields[1], fields[2], fields[3], 0xA );
			if ( line != 1 )
				item->InsertInList( &list );
		} else {
			// bad line
			MessageBox( NULL, _T("Bad file"), APPNAME, MB_OK|MB_ICONSTOP );
			return NULL;
		}
	}
}

void CompareCallback( HWND hWnd, const TCHAR * format, ... )
{
	TCHAR	msg[ 1024 ];
	va_list	va;

	va_start( va, format );
	_vstprintf( msg, format, va );
	va_end( va );

#if 1
	// Add to listbox
	SendMessage( GetDlgItem( hWnd, IDC_LIST ), LB_ADDSTRING, 0, (LPARAM)msg );
#else
	// Add to listview
	HWND hListview = GetDlgItem( hWnd, IDC_LIST );

	LVITEM	item;
	item.mask = LVIF_TEXT;
	item.iItem = 0x7FFFFFFF;
	item.iSubItem = 0;
	item.iImage = 0;
	item.pszText = msg;
	item.iItem = ListView_InsertItem( hListview, &item );

	item.iSubItem += 1;
	item.pszText = (TCHAR *) localpath;
	ListView_SetItem( hListview, &item );
#endif
}


INT_PTR CALLBACK CompareDialog( HWND hDlg, UINT message, UINT wParam, LONG lParam ) 
{
	static CResizer		resizer;
	static TCHAR		prevPath[ MAX_PATH ];
	OPENFILENAME		open;
	CShare			*	prev;

	switch ( message )  {
		case WM_INITDIALOG:
			// Create listview columns
			resizer.OnInitDialog( hDlg );
			// get path to file
			memset( &open, 0, sizeof open );
			open.lStructSize	= sizeof open;
			open.hwndOwner		= hDlg;
			open.lpstrFilter	= TEXT("Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0");
			open.lpstrFile		= prevPath;
			open.nMaxFile		= MAX_PATH;
			open.Flags			= OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST;
			open.lpstrTitle		= TEXT("Locate previously exported file");
			if ( ! GetOpenFileName( &open ) )  {
				EndDialog( hDlg, 0 );
				break;
			}
			// read file
			prev = ImportFile( prevPath );
			if ( prev == NULL )  {
				MessageBox( hDlg, _T("Error reading file"), APPNAME, MB_OK );
				break;
			}
			// compare files
			CompareShares( hDlg, prev, (CShare *)lParam, CompareCallback );
			// clean up
			delete prev;
			return TRUE;

		case WM_COMMAND:
			switch ( LOWORD(wParam) )  {
				case IDOK:
					EndDialog( hDlg, 0 );
					break;
			}
			break;

		case WM_CLOSE:
			EndDialog( hDlg, 0 );
			return TRUE;

		case WM_GETMINMAXINFO:
			resizer.OnGetMinMaxInfo( wParam, lParam );
			return 0;

		case WM_SIZE:
			resizer.OnSize( wParam, lParam );
			UpdateWindow( hDlg );
			return 0;

		case WM_NCHITTEST:
			SetWindowLong( hDlg, DWL_MSGRESULT, resizer.OnNcHitTest( wParam, lParam ) );
			return true;

		case WM_PAINT:
			resizer.OnPaint( wParam, lParam );
			break;

		default:
			break;
	}
    return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -