123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737 |
- /* ==========================================================================
- CTextFile
- Author : Johan Rosengren, Abstrakt Mekanik AB
- Date : 2004-03-22
- Purpose : The class is a helper-package for text files and
- windows. It allows loading and saving text files in a
- single operation, as well as getting text to and
- from edit- and listboxes. If an empty filename is given
- as a parameter to a call, the standard file dialog will
- be displayed, to let the user select a file.
- Error handling is managed internally, and the different
- API-functions return a BOOL to signal success or
- failure. In case of failure, FALSE returned, the member
- function GetErrorMessage can be called to retrieve a
- CString with the error message.
- If this string is empty, the file selection was aborted
- in the case of an empty input name.
- ========================================================================
- 14/4 2005 Added Dave Pritchards class CStdioFileEx
- for MBCS/UNICODE-support.
- ========================================================================*/
- #include "stdafx.h"
- #include "TextFile.h"
- #include "../External/StdioFileEx.h"
- ////////////////////////////////////////
- // CTextFile construction/destruction
- CTextFile::CTextFile( const CString& ext, const CString& eol )
- /* ============================================================
- Function : CTextFile::CTextFile
- Description : constructor
-
- Return : void
- Parameters : const CString& ext - Standard extension
- to use in case no
- file name is given.
- const CString& eol - The end-of-line to
- use. Defaults to
- "\r\n".
- ============================================================*/
- {
- m_extension = ext;
- m_eol = eol;
- }
- CTextFile::~CTextFile()
- /* ============================================================
- Function : CTextFile::~CTextFile
- Description : destructor
-
- Return : void
- Parameters : none
- ============================================================*/
- {
- }
- ////////////////////////////////////////
- // CTextFile operations
- //
- BOOL CTextFile::ReadTextFile( CString& filename, CStringArray& contents )
- /* ============================================================
- Function : CTextFile::ReadTextFile
- Description : Will read the contents of the file filename
- into the CStringArray contents, one line
- from the file at a time.
- If filename is empty, the standard file
- dialog will be displayed, and - if OK is
- selected - filename will contain the
- selected filename on return.
- Return : BOOL - TRUE if OK.
- GetErrorMessage
- will contain errors.
- Parameters : CString& filename - file to read from
- CStringArray& contents - will be filled
- with the contents
- of the file
- ============================================================*/
- {
- ClearError();
- BOOL result = TRUE;
- if( filename.IsEmpty() )
- result = GetFilename( FALSE, filename );
- if( result )
- {
- CStdioFileEx file;
- CFileException feError;
- if( file.Open( filename, CFile::modeRead , &feError ) )
- {
- contents.RemoveAll();
- CString line;
- while( file.ReadString( line ) )
- contents.Add( line );
- file.Close();
- }
- else
- {
- TCHAR errBuff[256];
- feError.GetErrorMessage( errBuff, 256 );
- m_error = errBuff;
- result = FALSE;
- }
- }
- return result;
- }
- BOOL CTextFile::ReadTextFile( CString& filename, CString& contents )
- /* ============================================================
- Function : CTextFile::ReadTextFile
- Description : Will read the contents of the file filename
- into contents.
- If filename is empty, the standard file
- dialog will be displayed, and - if OK is
- selected - filename will contain the
- selected filename on return.
-
- Return : BOOL - TRUE if OK.
- GetErrorMessage will
- contain errors.
- Parameters : CString& filename - file to read from
- CString& contents - will be filled with
- the contents of the
- file
- ============================================================*/
- {
- contents = _T( "" );
- // Error handling
- ClearError();
- CStdioFileEx file;
- CFileException feError;
- BOOL result = TRUE;
- if( filename.IsEmpty() )
- result = GetFilename( FALSE, filename );
- if( result )
- {
- // Reading the file
- if( file.Open( filename, CFile::modeRead | CFile::typeText, &feError ) )
- {
- CString line;
- while( file.ReadString( line ) )
- contents += line + m_eol;
- file.Close();
- }
- else
- {
- // Setting error message
- TCHAR errBuff[256];
- feError.GetErrorMessage( errBuff, 256 );
- m_error = errBuff;
- result = FALSE;
- }
- }
- return result;
- }
- BOOL CTextFile::WriteTextFile( CString& filename, const CStringArray& contents )
- /* ============================================================
- Function : CTextFile::WriteTextFile
- Description : Writes contents to filename. Will create
- the file if it doesn't already exist,
- overwrite it otherwise.
- If filename is empty, the standard file
- dialog will be displayed, and - if OK is
- selected - filename will contain the
- selected filename on return.
-
- Return : BOOL - TRUE if OK.
- GetErrorMessage
- will return
- errors
- Parameters : CString& filename - file to
- write to
- conste CStringArray& contents - contents
- to write
- ============================================================*/
- {
- // Error handling
- ClearError();
- CStdioFileEx file;
- CFileException feError;
- BOOL result = TRUE;
- if(filename.IsEmpty())
- result = GetFilename(TRUE, filename);
- if(result)
- {
- // Write file
- if(file.Open( filename, CFile::modeWrite | CFile::modeCreate , &feError))
- {
- INT_PTR max = contents.GetSize();
- for(int t = 0 ; t < max ; t++)
- {
- file.WriteString(contents[t] + m_eol);
- }
- file.Close();
- }
- else
- {
- // Set error message
- TCHAR errBuff[256];
- feError.GetErrorMessage(errBuff, 256);
- m_error = errBuff;
- result = FALSE;
- }
- }
- return result;
- }
- BOOL CTextFile::WriteTextFile( CString& filename, const CString& contents )
- /* ============================================================
- Function : CTextFile::WriteTextFile
- Description : Writes contents to filename. Will create
- the file if it doesn't already exist,
- overwrite it otherwise.
- If filename is empty, the standard file
- dialog will be displayed, and - if OK is
- selected - filename will contain the
- selected filename on return.
-
- Return : BOOL - TRUE if OK.
- GetErrorMessage
- will return
- errors
- Parameters : CString& filename - file to write to
- const CString& contents - contents to write
- ============================================================*/
- {
- // Error checking
- ClearError();
- CStdioFileEx file;
- CFileException feError;
- BOOL result = TRUE;
- if( filename.IsEmpty() )
- result = GetFilename( TRUE, filename );
- if( result )
- {
- // Write the file
- if( file.Open( filename, CFile::modeWrite | CFile::modeCreate , &feError ) )
- {
- file.WriteString( contents );
- file.Close();
- }
- else
- {
- // Set error message
- TCHAR errBuff[256];
- feError.GetErrorMessage( errBuff, 256 );
- m_error = errBuff;
- result = FALSE;
- }
- }
- return result;
- }
- BOOL CTextFile::AppendFile( CString& filename, const CString& contents )
- /* ============================================================
- Function : CTextFile::AppendFile
- Description : Appends contents to filename. Will create
- the file if it doesn't already exist.
- If filename is empty, the standard file
- dialog will be displayed, and - if OK is
- selected - filename will contain the
- selected filename on return.
- AppendFile will not add eols.
-
- Return : BOOL - TRUE if OK.
- GetErrorMessage
- will return errors
- Parameters : CString& filename - file to write to
- const CString& contents - contents to write
- ============================================================*/
- {
- CFile file;
- CFileException feError;
- BOOL result = TRUE;
- if( filename.IsEmpty() )
- result = GetFilename( TRUE, filename );
- if( result )
- {
- // Write the file
- if( file.Open( filename, CFile::modeWrite | CFile::modeCreate | CFile::modeNoTruncate, &feError ) )
- {
- file.SeekToEnd();
- file.Write( contents, contents.GetLength() );
- file.Close();
- }
- else
- {
- // Set error message
- TCHAR errBuff[256];
- feError.GetErrorMessage( errBuff, 256 );
- m_error = errBuff;
- result = FALSE;
- }
- }
- return result;
- }
- BOOL CTextFile::AppendFile( CString& filename, const CStringArray& contents )
- /* ============================================================
- Function : CTextFile::AppendFile
- Description : Appends contents to filename. Will create
- the file if it doesn't already exist.
- If filename is empty, the standard file
- dialog will be displayed, and - if OK is
- selected - filename will contain the
- selected filename on return.
-
- Return : BOOL - TRUE if OK.
- GetErrorMessage
- will return
- errors
- Parameters : CString& filename - file to write to
- CStringArray contents - contents to write
- ============================================================*/
- {
- CStdioFileEx file;
- CFileException feError;
- BOOL result = TRUE;
- if(filename.IsEmpty())
- result = GetFilename(TRUE, filename);
- if(result)
- {
- // Write the file
- if(file.Open(filename, CFile::modeWrite | CFile::modeCreate | CFile::modeNoTruncate, &feError))
- {
- file.SeekToEnd();
- INT_PTR max = contents.GetSize();
- for(int t = 0 ; t < max ; t++)
- file.WriteString(contents[t] + m_eol);
- file.Close();
- }
- else
- {
- // Set error message
- TCHAR errBuff[256];
- feError.GetErrorMessage(errBuff, 256);
- m_error = errBuff;
- result = FALSE;
- }
- }
- return result;
- }
- ////////////////////////////////////////
- // Window operations
- //
- BOOL CTextFile::Load( CString& filename, CEdit* edit )
- /* ============================================================
- Function : CTextFile::Load
- Description : Loads a text file from filename to the
- CEdit edit.
- If filename is empty, the standard file
- dialog will be displayed, and - if OK is
- selected - filename will contain the
- selected filename on return.
- No translation of eols will be made.
- Return : BOOL - FALSE if failure.
- GetErrorMessage will
- return the error.
- Parameters : CString& filename - name of file to load
- CEdit* edit - pointer to CEdit to
- set text to
- ============================================================*/
- {
- BOOL result = FALSE;
- // Error checking
- if( ValidParam( edit ) )
- {
- CString contents;
- if( ReadTextFile( filename, contents ) )
- {
- edit->SetWindowText( contents );
- result = TRUE;
- }
- }
- return result;
- }
- BOOL CTextFile::Load( CString& filename, CListBox* list )
- /* ============================================================
- Function : CTextFile::Load
- Description : Loads a text file from filename to the
- CListBox list.
- If filename is empty, the standard file
- dialog will be displayed, and - if OK is
- selected - filename will contain the
- selected filename on return.
- Return : BOOL - FALSE if failure.
- GetErrorMessage will
- return the error.
- Parameters : CString& filename - name of file to load
- CListBox* list - pointer to CListBox
- to set text to
- ============================================================*/
- {
- BOOL result = FALSE;
- // Error checking
- if(ValidParam(list))
- {
- // Read the file
- CStringArray contents;
- if(ReadTextFile( filename, contents))
- {
- // Set to listbox
- INT_PTR max = contents.GetSize();
- for(int t = 0 ; t < max ; t++)
- {
- if(contents[t].GetLength())
- {
- list->AddString(contents[t]);
- }
- }
- result = TRUE;
- }
- }
- return result;
- }
- BOOL CTextFile::Save( CString& filename, CEdit* edit )
- /* ============================================================
- Function : CTextFile::Save
- Description : Saves the contents of the CEdit edit to the
- file filename. The file will be created or
- overwritten.
- If filename is empty, the standard file
- dialog will be displayed, and - if OK is
- selected - filename will contain the
- selected filename on return.
- Note that the eol-öarkers from the editbox
- will be used.
- Return : BOOL - FALSE if failure.
- GetErrorMessage will
- return the error.
- Parameters : CString& filename - name of file to save
- to. Will be
- overwritten
- CEdit* edit - pointer to CEdit to
- get text from
- ============================================================*/
- {
- BOOL result = FALSE;
- // Error checking
- if( ValidParam( edit ) )
- {
- // Get text
- CString contents;
- edit->GetWindowText( contents );
- // Write file
- if( WriteTextFile( filename, contents ) )
- result = TRUE;
- }
- return result;
- }
- BOOL CTextFile::Save( CString& filename, CListBox* list )
- /* ============================================================
- Function : CTextFile::Save
- Description : Saves the contents of the CListBox list to
- the file filename. The file will be created
- or overwritten.
- If filename is empty, the standard file
- dialog will be displayed, and - if OK is
- selected - filename will contain the
- selected filename on return.
-
- Return : BOOL - FALSE if failure.
- GetErrorMessage will
- return the error.
- Parameters : CString& filename - name of file to save
- to. Will be
- overwritten
- CListBox* list - pointer to CListBox
- to get text from
- ============================================================*/
- {
- BOOL result = FALSE;
- // Error checking
- if( ValidParam( list ) )
- {
- // Get listbox contents
- CStringArray contents;
- int max = list->GetCount();
- for( int t = 0; t < max ; t++ )
- {
- CString line;
- list->GetText( t, line );
- contents.Add( line );
- }
- // Write file
- if( WriteTextFile( filename, contents ) )
- result = TRUE;
- }
- return result;
- }
- ////////////////////////////////////////
- // Error handling
- //
- CString CTextFile::GetErrorMessage()
- /* ============================================================
- Function : CTextFile::GetErrorMessage
- Description : Retrieves the error message. Should be
- called after any of the file operations
- returns FALSE and the file name is not
- empty.
- Return : CString - The current error string
- Parameters : none
- ============================================================*/
- {
- return m_error;
- }
- ////////////////////////////////////////
- // Private functions
- //
- void CTextFile::ClearError()
- /* ============================================================
- Function : CTextFile::ClearError
- Description : Clears the internal error string. Should
- be called first by all functions setting
- the error message string.
- Return : void
- Parameters : none
- ============================================================*/
- {
- m_error = _T( "" );
- }
- BOOL CTextFile::ValidParam( CWnd* wnd )
- /* ============================================================
- Function : CTextFile::ValidParam
- Description : Used to check parameters of the Save/Load
- functions. The pointer to the window must
- be valid and the window itself must exist.
-
- Return : BOOL - FALSE if any parameter
- was invalid
- Parameters : CWnd* wnd - a window pointer, that
- must be valid, to a
- window
- ============================================================*/
- {
- ClearError();
- BOOL result = TRUE;
- if( wnd == NULL )
- {
- ASSERT( FALSE );
- result = FALSE;
- }
- if( !IsWindow( wnd->m_hWnd ) )
- {
- ASSERT( FALSE );
- result = FALSE;
- }
- if( !result )
- m_error = _T( "Bad Window handle as parameter" );
- return result;
- }
- BOOL CTextFile::GetFilename( BOOL save, CString& filename )
- /* ============================================================
- Function : CTextFile::GetFilename
- Description : The function will display a standard file
- dialog. If the instance is created with an
- extension, the extension will be used to
- filter files.
-
- Return : BOOL - TRUE if a file was
- selected
- Parameters : BOOL save - TRUE if the file
- should be saved.
- CString& filename - Placeholder for the
- selected filename
- ============================================================*/
- {
- CString filter;
- CString extension = GetExtension();
- if( extension.GetLength() )
- filter = extension + _T( "-files (*." + extension + ")|*." ) + extension + _T( "|All Files (*.*)|*.*||" );
- BOOL result = FALSE;
- CFileDialog dlg( !save, extension, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter );
- if( dlg.DoModal() == IDOK )
- {
- filename = dlg.GetPathName();
- result = TRUE;
- }
- return result;
- }
- CString CTextFile::GetExtension()
- /* ============================================================
- Function : CTextFile::GetExtension
- Description : An accessor for the m_extension field.
-
- Return : CString - the extension.
- Parameters : none
- ============================================================*/
- {
- return m_extension;
- }
|