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

📄 makefiledlg.cpp

📁 创建巨型文件的参考源代码
💻 CPP
字号:
// MakeFileDlg.cpp : implementation file

#include "stdafx.h"
#include "MakeFile.h"
#include "MakeFileDlg.h"

#include "SBDestination.h"

#ifdef _DEBUG
#   define new DEBUG_NEW
#   undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

UINT64		nMultiplier[7] =
{
	(UINT64) 1,																		// byte
	(UINT64) 1024,																	// Kb
	(UINT64) 1024 * (UINT64) 1000,													// Mb
	(UINT64) 1024 * (UINT64) 1000 * (UINT64) 1000,									// Gb
	(UINT64) 1024 * (UINT64) 1000 * (UINT64) 1000 * (UINT64) 1000,					// Tb
	(UINT64) 1024 * (UINT64) 1000 * (UINT64) 1000 * (UINT64) 1000 * (UINT64) 1000,	// Pb
	(UINT64) 1024 * (UINT64) 1000 * (UINT64) 1000 * (UINT64) 1000 * (UINT64) 1000 * (UINT64) 1000,	// Eb
};

class		CRandomBuffer
{
public:
	CRandomBuffer(int nSize = 1024)
	{
		srand((unsigned) time(NULL));
		m_data = new BYTE[nSize];
		for(int i = 0; i < nSize; i++)
			m_data[i] = (BYTE) rand();
	};
	~CRandomBuffer(void)
	{
		delete[] m_data;
	}
	operator LPBYTE(void)
	{
		return m_data;
	};
private:
	BYTE*	m_data;
};

// CAboutDlg dialog used for App About

class CAboutDlg :
	public CDialog
{
public:
	CAboutDlg(void);

protected:
	DECLARE_MESSAGE_MAP()
};

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

CAboutDlg::CAboutDlg(void) :
	CDialog(IDD_ABOUTBOX)
{
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()

// /////////////////////////////////////////////////////////////////////////////
//    CMakeFileDlg dialog
// /////////////////////////////////////////////////////////////////////////////

CMakeFileDlg::CMakeFileDlg(CWnd* pParent /* NULL */ ) :
	CDialog(CMakeFileDlg::IDD, pParent)
{
	m_szFilename = _T("");
	m_nSize = 0;
	m_bRandom = FALSE;
	m_nUnit = -1;
	m_szResult = _T("");
	m_bQuick = FALSE;

	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	char	buf[MAX_PATH];
	////////////////////

	GetCurrentDirectory(MAX_PATH, buf);
	m_strBrowse = buf;
	m_szFilename = m_strBrowse + "\\Testfile.Dat";

	m_bInit = FALSE;
}

// /////////////////////////////////////////////////////////////////////////////
// ///////////////////////////////////////////////////////////////////////////////
void CMakeFileDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);

	DDX_Text(pDX, IDC_EDIT1, m_szFilename);
	DDX_Text(pDX, IDC_EDIT2, m_nSize);
	DDX_Check(pDX, IDC_RANDOM, m_bRandom);
	DDX_CBIndex(pDX, IDC_UNITS, m_nUnit);
	DDX_Text(pDX, IDC_RESULT, m_szResult);
	DDX_Check(pDX, IDC_BQUICK, m_bQuick);
}

BEGIN_MESSAGE_MAP(CMakeFileDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_EN_CHANGE(IDC_EDIT2, OnChangeSize)
	ON_CBN_SELCHANGE(IDC_UNITS, OnSelchangeUnits)
	ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
	ON_BN_CLICKED(IDC_BQUICK, OnBQuick)
END_MESSAGE_MAP()

// /////////////////////////////////////////////////////////////////////////////
//    CMakeFileDlg message handlers
// /////////////////////////////////////////////////////////////////////////////

BOOL CMakeFileDlg::OnInitDialog(void)
{
	CDialog::OnInitDialog();
	OleInitialize(NULL);

	// Add "About..." menu item to system menu.
	// IDM_ABOUTBOX must be in the system command range.

	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu*	pSysMenu = GetSystemMenu(FALSE);
	//////////////////////////////////////

	if(pSysMenu != NULL)
	{
		CString strAboutMenu;
		///////////////////

		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if(!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	SetIcon(m_hIcon, TRUE);		// Set big icon
	SetIcon(m_hIcon, FALSE);	// Set small icon

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


	m_bInit = FALSE;

	CSpinButtonCtrl*	m_pSpinner = (CSpinButtonCtrl*) GetDlgItem(IDC_SPINSIZE);
	////////////////////////////////////////////////////////////////////////////

	m_pSpinner->SetRange32(0, UD_MAXVAL);
	m_nUnit = 0;
	UpdateData(FALSE);

	m_bInit = TRUE;
	return TRUE;				// return TRUE unless you set the focus to a control
}

// /////////////////////////////////////////////////////////////////////////////
// ///////////////////////////////////////////////////////////////////////////////
void CMakeFileDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg().DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,

// /////////////////////////////////////////////////////////////////////////////
//    this is automatically done for you by the framework.
// /////////////////////////////////////////////////////////////////////////////

void CMakeFileDlg::OnPaint(void)
{
	if(IsIconic())
	{
		CPaintDC	dc(this);	// device context for painting
		///////////////////

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle

		int		cxIcon = GetSystemMetrics(SM_CXICON);
		int		cyIcon = GetSystemMetrics(SM_CYICON);
		CRect	rect;
		///////////////////////////////////////////

		GetClientRect(&rect);

		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;
		///////////////////////////////////////

		// Draw the icon

		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// /////////////////////////////////////////////////////////////////////////////
// ///////////////////////////////////////////////////////////////////////////////
HCURSOR CMakeFileDlg::OnQueryDragIcon(void)
{
	return(HCURSOR) m_hIcon;
}

// /////////////////////////////////////////////////////////////////////////////
// ///////////////////////////////////////////////////////////////////////////////
void CMakeFileDlg::OnOK(void)
{
	UpdateData();

	CWaitCursor		cwait;
	CProgressCtrl*	pProg = (CProgressCtrl*) GetDlgItem(IDC_PROGRESS1);
	//////////////////////////////////////////////////////////////////

	pProg->ShowWindow(TRUE);

	int		flags = CREATE_NEW;
retrypoint1:
	HANDLE	hFile = CreateFile(m_szFilename, GENERIC_WRITE, 0, NULL, flags, FILE_ATTRIBUTE_NORMAL, NULL);
	///////////////////////////////////////////////////////////////////////////////////////////////////

	if(hFile == INVALID_HANDLE_VALUE)
	{
		DWORD	dwErr = GetLastError();
		/////////////////////////////

		if(dwErr == ERROR_FILE_EXISTS)
		{
			if(AfxMessageBox("File exists. Overwrite?", MB_ICONQUESTION | MB_YESNO) == IDYES)
			{
				flags = CREATE_NEW | CREATE_ALWAYS;
				goto retrypoint1;
			}
		}
		else
		{
			ErrorMessage(dwErr);
		}
	}

	if(hFile != INVALID_HANDLE_VALUE)
	{
		if(m_bQuick)
		{
			LARGE_INTEGER	l;
			////////////////////

			l.QuadPart = (UINT64) m_nSize * nMultiplier[m_nUnit];
#ifndef W2k_ONLY
			if(INVALID_SET_FILE_POINTER == SetFilePointer(hFile, l.LowPart, &l.HighPart, FILE_BEGIN))
#else
				if(!SetFilePointerEx(hFile, l, &lp, FILE_BEGIN))
#endif
				{
					ErrorMessage(GetLastError());
				}
				else
				{
					if(!SetEndOfFile(hFile))
					{
						ErrorMessage(GetLastError());
					}
				}
		}
		else
		{
#define BLOCK_SIZE	32768
			DWORD	dwWritten;
			UINT64	nSize;
			////////////////

			nSize = (UINT64) m_nSize * nMultiplier[m_nUnit];

			pProg->SetRange32(0, (INT) (nSize / BLOCK_SIZE));
			pProg->SetPos(0);
			pProg->SetStep(1);
			if(m_bRandom)
			{
				for(UINT64 i = 0; i < nSize / BLOCK_SIZE; i++)
				{
					if(!WriteFile(hFile, (LPVOID) LPBYTE(CRandomBuffer(BLOCK_SIZE)), BLOCK_SIZE, &dwWritten, NULL))
					{
						ErrorMessage(GetLastError());
						break;
					}

					pProg->StepIt();
				}

				if(nSize % BLOCK_SIZE)
				{
					if(!WriteFile(hFile, (LPVOID) LPBYTE(CRandomBuffer((DWORD)(nSize % BLOCK_SIZE))), (DWORD)(m_nSize % 8192), &dwWritten, NULL))
					{
						ErrorMessage(GetLastError());
					}
				}
			}
			else
			{
				char	buf[BLOCK_SIZE];
				//////////////////////

				ZeroMemory(buf, BLOCK_SIZE);
				for(UINT64 i = 0; i < nSize / BLOCK_SIZE; i++)
				{
					if(!WriteFile(hFile, (LPVOID) buf, BLOCK_SIZE, &dwWritten, NULL))
					{
						ErrorMessage(GetLastError());
						break;
					}

					pProg->StepIt();
				}

				if(nSize % BLOCK_SIZE)
				{
					if(!WriteFile(hFile, (LPVOID) buf, m_nSize % 8192, &dwWritten, NULL))
					{
						ErrorMessage(GetLastError());
					}
				}
			}
		}

		CloseHandle(hFile);
	}

	GetDlgItem(IDC_PROGRESS1)->ShowWindow(FALSE);

	// CDialog::OnOK();

}

// /////////////////////////////////////////////////////////////////////////////
// ///////////////////////////////////////////////////////////////////////////////
void CMakeFileDlg::OnChangeSize(void)
{
	if(!m_bInit)
		return;

	UpdateData();

	UpdateFileSize();
}

// /////////////////////////////////////////////////////////////////////////////
// ///////////////////////////////////////////////////////////////////////////////
void CMakeFileDlg::OnSelchangeUnits(void)
{
	if(!m_bInit)
		return;

	UpdateData();

	UpdateFileSize();
}

// /////////////////////////////////////////////////////////////////////////////
// ///////////////////////////////////////////////////////////////////////////////
void CMakeFileDlg::UpdateFileSize(void)
{
	UINT64	nSize = 0;
	char	buf[256];
	////////////////

	nSize = m_nSize * nMultiplier[m_nUnit];

	m_szResult.Format("%I64u", nSize);
	m_szResult.MakeReverse();
	for(int i = 0, o = 0; i < m_szResult.GetLength(); i++)
	{
		buf[o] = m_szResult[i];
		o++;
		if((i % 3) == 2)
			buf[o++] = '.';
	}

	if(buf[o - 1] == '.')
		o--;
	buf[o] = '\0';
	m_szResult = buf;
	m_szResult.MakeReverse();
	m_szResult += " Bytes";
	UpdateData(FALSE);
}

// /////////////////////////////////////////////////////////////////////////////
// ///////////////////////////////////////////////////////////////////////////////
void CMakeFileDlg::OnBrowse(void)
{
	UpdateData();

	char	fn[MAX_PATH],
			ext[MAX_PATH];
	////////////////////

	_splitpath(m_szFilename, NULL, NULL, fn, ext);

	CSBDestination	sb(m_hWnd);
	/////////////////////////

	sb.SetFlags(BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT | BIF_USENEWUI | BIF_VALIDATE);
	sb.SetInitialSelection(m_strBrowse);
	if(sb.SelectFolder())
	{
		m_strBrowse = sb.GetSelectedFolder();
		m_szFilename = m_strBrowse + "\\";

		UpdateData(FALSE);
	}
}

// /////////////////////////////////////////////////////////////////////////////
// ///////////////////////////////////////////////////////////////////////////////
void CMakeFileDlg::OnBQuick(void)
{
	UpdateData(TRUE);
	m_bRandom = m_bQuick;
	UpdateData(FALSE);
}

// /////////////////////////////////////////////////////////////////////////////
// ///////////////////////////////////////////////////////////////////////////////
void CMakeFileDlg::ErrorMessage(DWORD err)
{
	LPVOID	lpMsgBuf;
	///////////////

	FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
	(LPTSTR) & lpMsgBuf, 0, NULL);	// Process any inserts in lpMsgBuf.

	// ...// Display the string.

	MessageBox((LPCTSTR) lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION);

	// Free the buffer.

	LocalFree(lpMsgBuf);
}
///////////////////////////////////////////////////////////////////
void CRandomArrayFromTxt::GetRandomArrayFromTxt(int m_Collect_Times,
												double *a_Random,
												int m_Txt_Line,
                                                int m_Txt_Row,
												int m_Txt_Spacing)
{

    int m,mx,my,cl;    
	srand((unsigned)time(NULL));  // 生成时间种子
	m=rand()%m_Txt_Line;          // 返回一个0-m_Txt_Line-1的随机数,即查表的起始位置
	mx=m%m_Txt_Row;               // 查表起始位置的列号,文件头为0行0列
	my=m/m_Txt_Row;               // 查表起始位置的行号

    cl=(m_Collect_Times+mx-1)/m_Txt_Row+1;  // 需要从数表中读取的行数
    
    // 打开txt文本的数表。    
    CStdioFile file1( "C:\\Yg\\Debug\\ramdom1000.txt",
          CFile::modeNoTruncate | CFile::modeRead | CFile::typeText); 


    CString strc;    
	int ct=0;  // 用于记录当前已经取得的随机数个数
    for(m=0;m<my;m++)
    {
        file1.ReadString(strc);    
	}

    // 取出有用的行,直到取够为之    
	for(int n=0;n<cl;n++)       
	{        
		if(n+my==m_Txt_Line) 
			file1.SeekToBegin(); 
		
		// 数表不够长,重新定位到文件头        
		file1.ReadString(strc);

        if(n==0) // 如果是取得的第一行
		{        
			int aw1,aw2;
            aw1=strc.GetLength();
            for(m=0;m<mx+1;m++)  // 过掉前面无用的空格    
			{  
				aw1=strc.GetLength();  
				aw2=strc.Find("   "); // 找到作为间隔的前三个空格所在位置  
				strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取这三个空格右边的所有字符串            
			}

            // 下面取出剩下的字符串中每三个空格前面的字符串,就是所要查一个数据 
			for(m=0;m<m_Txt_Row-mx&&ct<m_Collect_Times;m++)            
			{
                aw2=strc.Find("  ");// 找到作为间隔的后三个空格所在位置
				if(mx==m_Txt_Row-1||m==m_Txt_Row-mx-1)   
					a_Random[ct]=atof(strc);              
				else
                    a_Random[ct]=atof(strc.Left(aw2)); // 保存数据到数组     
				aw1=strc.GetLength();        
				aw2=strc.Find("   ");   // 找到作为间隔的前三个空格所在位置            
				strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取这三个空格右边的所有字符串 
				ct++;          
			}  
		}
        else
        { 
			GetRandomArrayFromALine(strc,a_Random,
				                    m_Collect_Times,
									m_Txt_Row,
									m_Txt_Spacing,
									ct); 
            ct+=m_Txt_Row;       
		}  
	}  
	file1.Close();}
///////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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