BOOL CFileBasedProjectTemplateItem::CreateMainFile(LPCTSTR lpszTargetPath, LPCTSTR lpszCrLf) { CStringW text; TextDocument doc; bool result = doc.Read(m_strPath,text); if (result) { const CStringW lineendings(L"\r\n"); int index = text.FindOneOf(lineendings); if (index != -1) { CStringW line = text.Left(index); const CStringW strKey(L"%DESCRIPTION: "); CStringW strStartOfLine = line.Left(strKey.GetLength()); strStartOfLine.MakeUpper(); if (strKey == strStartOfLine) { text.Delete(0,index); text.TrimLeft(lineendings + L' '); } } LPCWSTR le = GetLineEnding(static_cast<LPCWSTR>(text),text.GetLength()); USES_CONVERSION; if (std::wcscmp(le,T2CW(lpszCrLf)) != 0) // Line endings not equal text.Replace(le,lpszCrLf); result = doc.Write(lpszTargetPath,text); } return result; }
BOOL CFileTextLines::Save(const CString& sFilePath, bool bSaveAsUTF8, DWORD dwIgnoreWhitespaces /*=0*/, BOOL bIgnoreCase /*= FALSE*/, bool bBlame /*= false*/) { try { CString destPath = sFilePath; // now make sure that the destination directory exists int ind = 0; while (destPath.Find('\\', ind)>=2) { if (!PathIsDirectory(destPath.Left(destPath.Find('\\', ind)))) { if (!CreateDirectory(destPath.Left(destPath.Find('\\', ind)), NULL)) return FALSE; } ind = destPath.Find('\\', ind)+1; } CStdioFile file; // Hugely faster than CFile for big file writes - because it uses buffering if (!file.Open(sFilePath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary)) { m_sErrorString.Format(IDS_ERR_FILE_OPEN, (LPCTSTR)sFilePath); return FALSE; } if ((!bSaveAsUTF8)&&(m_UnicodeType == CFileTextLines::UNICODE_LE)) { //first write the BOM UINT16 wBOM = 0xFEFF; file.Write(&wBOM, 2); for (int i=0; i<GetCount(); i++) { CString sLine = GetAt(i); EOL ending = GetLineEnding(i); StripWhiteSpace(sLine,dwIgnoreWhitespaces, bBlame); if (bIgnoreCase) sLine = sLine.MakeLower(); file.Write((LPCTSTR)sLine, sLine.GetLength()*sizeof(TCHAR)); if (ending == EOL_AUTOLINE) ending = m_LineEndings; switch (ending) { case EOL_CR: sLine = _T("\x0d"); break; case EOL_CRLF: case EOL_AUTOLINE: sLine = _T("\x0d\x0a"); break; case EOL_LF: sLine = _T("\x0a"); break; case EOL_LFCR: sLine = _T("\x0a\x0d"); break; default: sLine.Empty(); break; } if ((m_bReturnAtEnd)||(i != GetCount()-1)) file.Write((LPCTSTR)sLine, sLine.GetLength()*sizeof(TCHAR)); } } else if ((!bSaveAsUTF8)&&((m_UnicodeType == CFileTextLines::ASCII)||(m_UnicodeType == CFileTextLines::AUTOTYPE))) { for (int i=0; i< GetCount(); i++) { // Copy CString to 8 bit without conversion CString sLineT = GetAt(i); CStringA sLine = CStringA(sLineT); EOL ending = GetLineEnding(i); StripAsciiWhiteSpace(sLine,dwIgnoreWhitespaces, bBlame); if (bIgnoreCase) sLine = sLine.MakeLower(); if ((m_bReturnAtEnd)||(i != GetCount()-1)) { if (ending == EOL_AUTOLINE) ending = m_LineEndings; switch (ending) { case EOL_CR: sLine += '\x0d'; break; case EOL_CRLF: case EOL_AUTOLINE: sLine.Append("\x0d\x0a", 2); break; case EOL_LF: sLine += '\x0a'; break; case EOL_LFCR: sLine.Append("\x0a\x0d", 2); break; } } file.Write((LPCSTR)sLine, sLine.GetLength()); } } else if ((bSaveAsUTF8)||((m_UnicodeType == CFileTextLines::UTF8BOM)||(m_UnicodeType == CFileTextLines::UTF8))) { if (m_UnicodeType == CFileTextLines::UTF8BOM) { //first write the BOM UINT16 wBOM = 0xBBEF; file.Write(&wBOM, 2); UINT8 uBOM = 0xBF; file.Write(&uBOM, 1); } for (int i=0; i<GetCount(); i++) { CStringA sLine = CUnicodeUtils::GetUTF8(GetAt(i)); EOL ending = GetLineEnding(i); StripAsciiWhiteSpace(sLine,dwIgnoreWhitespaces, bBlame); if (bIgnoreCase) sLine = sLine.MakeLower(); if ((m_bReturnAtEnd)||(i != GetCount()-1)) { if (ending == EOL_AUTOLINE) ending = m_LineEndings; switch (ending) { case EOL_CR: sLine += '\x0d'; break; case EOL_CRLF: case EOL_AUTOLINE: sLine.Append("\x0d\x0a",2); break; case EOL_LF: sLine += '\x0a'; break; case EOL_LFCR: sLine.Append("\x0a\x0d",2); break; } } file.Write((LPCSTR)sLine, sLine.GetLength()); } } file.Close(); } catch (CException * e) { e->GetErrorMessage(m_sErrorString.GetBuffer(4096), 4096); m_sErrorString.ReleaseBuffer(); e->Delete(); return FALSE; } return TRUE; }