📄 makefiledlg.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 + -