int CmyLabTwoDlg::FindFileWriteInBase(CString PathFile,CString format) //Ищет в катологе файлы формата "format"
{
UpdateData(true); // Копируем данные из элем. управление в связанные сним переменные
ListFiles.RemoveAllGroups();
CStdioFile fout(PathFile, CFile::modeWrite);
WIN32_FIND_DATA FindFileData; // Содержит информацию о файле
HANDLE hFind=NULL; // Дескриптр на фаил
hFind=FindFirstFile(m_PathFolder+"\\"+format, &FindFileData); // Ищем файлы фармата ".doc || .exl"
if(hFind!=INVALID_HANDLE_VALUE)
{
do
{
fout.WriteString(FindFileData.cFileName); // Добавляет имя файла в базу, т.е в файл "base.txt"
fout.WriteString(L"\n" + myConvertSize(FindFileData) + "\n"); // Добавляет размер файла, низкого порядка DWORD
CString b=m_PathFolder+"\\"+FindFileData.cFileName; //Полный путь к найденному файлу
fout.WriteString(myGetChangeFileTime(b)+"\n"); // Добавляет время изменения файла.
fout.WriteString(AttributesFile(FindFileData.dwFileAttributes)+"\n"); // Добавляет инф. об атрибутах
fout.WriteString(b+"\n"); //Добавляем полный путь к файлу
}while(FindNextFile(hFind, &FindFileData) != 0);
FindClose(hFind);
fout.Close();
return 1;
}
return 0;
}.
Искажение данных
Вообщем данный участок кода ищет в каталоге файлы с форматам format - в основном это ".doc || .exl". Когда файл найден с него считываются данные (т.е имя, вес, дата создания и т.д) после этого полученная информация записывается в файл PathName.
Так вот самый первый найденный файл записывается нормально, а последующая информация
об остальных файлах частично искажена.
Большое спасибо.
Код:
Результат:
Doc1.doc
21
26.1.2012
Archive
C:\Users\Al\Desktop\1\Doc1.doc
Do
35
26.1.2012
Archive
C:\Users\Al\Desktop\1\DoDo
76
30.1.2012
Archive
C:\Users\Al\Desktop\1\DoDo
68
30.1.2012
Archive
C:\Users\Al\Desktop\1\Do
Вроде всё правильно в коде.
А что содержится в переменной format? Что за формат файла .exl? Может .xls имели ввиду?
Цитата: sem2711
А что содержится в переменной format? Что за формат файла .exl? Может .xls имели ввиду?
В этой переменной содержится форматы файлов. Например format="*.doc".
sem2711 вы правы, я малость переборщил.
Цитата: arrjj
Большое спасибо. Сейчас попробую что нибудь предпринять.
Может быть данная проблема возникает из за переполнения? Спасибо.
Цитата:
MSDN: WriteString throws an exception in response to several conditions, including the disk-full condition.
Спасибо.
Уважаемый arrjj благодарю вас за частичную помощь.
И все же проблему не удалось решить до конца.
В предыдущей работе тоже использовал класс СStdioFile только все работало нормально, за исключением если в переменной(объекте) типа СString содержалась кириллица(т.е русские букафки).
Вот эта часть:
Код:
CStdioFile File(PathName, CFile::modeCreate|CFile::modeWrite);
for(int i=0; i<NumberElements; i++)
{
for(int j=0; j<2; j++)
{
CString ListNameFile=ListFiles.GetItemText(i,j)+"\n";
File.WriteString((LPCTSTR)ListNameFile);
}
}
for(int i=0; i<NumberElements; i++)
{
for(int j=0; j<2; j++)
{
CString ListNameFile=ListFiles.GetItemText(i,j)+"\n";
File.WriteString((LPCTSTR)ListNameFile);
}
}
Спасибо.
Почему не отказаться от CStdioFile в пользу каких-нибудь других методов i/o.
Попробуй выставить другую кодировку через setlocale().
Используется unicod, также используется DLL.
WideCharToMultiByte перекодировать строку.
Насколько знаю CStdioFile работает с ascii, попробуй сначала через
Решение: setlocale(LC_ALL, "English");
Вот новое решение:
Цитата:
void WriteString(CFile &fr, const CString& str)
{
char *tmp = NULL;
BOOL change = FALSE;
int size = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), NULL, 0, "?", &change); //Возвратить размер буфера в байтах
tmp = new char[size+1](); // Выделить "size+1" ячеёк памяти символьного типа и инициализировать их пустым значением
WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), tmp, size+1, "?", &change); // Преобразовать строку СString в строку символов,
//т.е char'ов
fr.Write(tmp, size); // Записать в базу
delete [] tmp;
const char crlf[] = "\r\n"; // Возвращаем каретку в начало строки и переходим на новую строку
fr.Write(crlf, strlen(crlf));
}
{
char *tmp = NULL;
BOOL change = FALSE;
int size = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), NULL, 0, "?", &change); //Возвратить размер буфера в байтах
tmp = new char[size+1](); // Выделить "size+1" ячеёк памяти символьного типа и инициализировать их пустым значением
WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), tmp, size+1, "?", &change); // Преобразовать строку СString в строку символов,
//т.е char'ов
fr.Write(tmp, size); // Записать в базу
delete [] tmp;
const char crlf[] = "\r\n"; // Возвращаем каретку в начало строки и переходим на новую строку
fr.Write(crlf, strlen(crlf));
}
Цитата: Alek231
Снова столкнулся с этой же проблемой, но setlocale уже не помогает.
Вот новое решение:
Вот новое решение:
Что такое fr?
Используй другие методы записи в файл, тогда не нужно будет ничего никуда конвертировать, выставлять локали и прочими вещами заморачиватся.