Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/30: Рейтинг темы: голосов - 30, средняя оценка - 4.70
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
1

Работа с файлами (WIN32 API)

18.06.2011, 20:22. Показов 5621. Ответов 2
Метки нет (Все метки)

Вот какое было задание:
Обходя заданные каталоги, найдите самый большой файл, удовлетворяющий заданной маске. Выведите на консоль 3 последние строки этого файла, используя функцию CreateFile. Сделайте текущим каталог, в котором находится найденный файл. Создайте в этом каталоге свой новый каталог. Скопируйте в него найденный файл.
Во общем то интересует лишь пункт выделенный жирным шрифтом и подчёркнутый, остальное сделано почти всё (создать подкаталог и скопировать найденный файл не проблема, но сделаю позже). Прошу помочь в завершении задачи, т.к. Win API с трудом даётся и полной справки по категории нигде нет!
Вот наработки: lab.7z
Скинул только папки с файлами внутри и исходник (заранее созданными и наполненными), надеюсь создать пустой проект консольного приложения C++ будет посильной задачей ))
Среду разработки использовал CodeBlocks, но код совместим и с другими...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.06.2011, 20:22
Ответы с готовыми решениями:

Win32 API Работа с процессами
Господа, здравствуйте! Я новичок в программировании, помогите пожалуйста в программе, не знаю как...

Ошибка компиляции простой программы
Здравствуйте, читатели данной темы.Решил изучить C++ Win32 API.Но вот на сайте хотел скопировать...

Змейка на win32 api C++
ребят, возможно у кого затерялась змейка на win32 api C++, даже самый примитивный вариант сойдет,...

Практикум по Win32 API
Нигде не могу найти самостоятельные задания по винапи, подкиньте книги или дайте ссылочку,...

2
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
18.06.2011, 22:34  [ТС] 2
Лучший ответ Сообщение было отмечено _arty_ как решение

Решение

Доработал немного код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <windows.h>
#include <iostream>
#include<stdio.h>
 
using namespace std;
 
//---------------------------------------------------------------------------
 
 
void prosm(char** mas, int n)
 
{int i;
for (i = 0; i < n; i++) puts(mas[i]);}
 
 
char **zap_mas(int n)
{
char **hstr;
int i;
int m = 80;
hstr = new char*[n];
for (i = 0; i < n; i++) hstr[i] = new char[m];
//clrscr();
cout<<"Vvedite imena katalogov dlya poiska \n";
for (i = 0; i < n; i++) gets(hstr[i]);
return(hstr);
}
 
 
int main(int argc, char* argv[])
{
const int szBuf=256;
char cd[256];
char cBuf[szBuf];
char **dir;
char **A;
char*pDIR;
int kol,kolA;
 
 
GetCurrentDirectory(szBuf,cBuf);           // Текущий каталог
 
cout<<cBuf<<"\n";
 
cout<<"Vvedte imya katologa"<<"\n";
cin>>cd;
if (!CreateDirectory(cd,NULL)) MessageBox(NULL,"не возможно создать каталог, возможно он уже существует!","Ошибка",MB_OK);  //Создание каталога
SetCurrentDirectory(cd);          // делаем новый католог текущим
GetCurrentDirectory(szBuf,cBuf);      // определяем текущий католог
cout<<"\n"<<cBuf<<"\n";
//-------- Поиск-------
char p[20];
 
cout<<"Vvedite masku faila \n";
cin>>p;
WIN32_FIND_DATA fl;
HANDLE hf;
SYSTEMTIME t;
FILETIME f;
hf=FindFirstFile(p,&fl);
FileTimeToLocalFileTime(&fl.ftCreationTime,&f);
FileTimeToSystemTime(&f,&t);
cout<<"\n Imia faila: "<<fl.cFileName<<" vremya "<<t.wDay<<"."<<t.wMonth<<"."<<t.wYear<<" "<<t.wHour<<":"<<t.wMinute<<"\n";
 
while(FindNextFile(hf,&fl))
{
 FileTimeToSystemTime(&f,&t);
cout<<"\n Imia faila: "<<fl.cFileName<<" vremya "<<t.wDay<<"."<<t.wMonth<<"."<<t.wYear<<" "<<t.wHour<<":"<<t.wMinute<<"\n";
}
 
 
 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
char fName[100];
char fpName[100];
char g[10];
int szDir=256;
char dirName[szDir];
int i;
DWORD32 fSize = 0;
DWORD32 fPrimeSize = 0;
 
SetCurrentDirectory("C:\\CodeBlocks_projects\\lab");
GetCurrentDirectory(szDir,dirName);
cout<<"\n"<<dirName<<"\n";
 
cout<<"\n Vvedite kolichestvo katalogov dlya poiska \n";
 
cin>>kol;
dir = zap_mas(kol+1);
cout<<"\n";
prosm(dir,kol+1);
cout<<"\n";
cout<<"\n Vvedite masku failov \n";
 
cin>>g;
 
WIN32_FIND_DATA fl2;
HANDLE hf2;
 
for(i=1;i<kol+1;i++) {
    fSize = 0;
SetCurrentDirectory("C:\\CodeBlocks_projects\\lab");
SetCurrentDirectory(dir[i]);
cout<<"\n"<<i;
cout<<"\n"<<dir[i];
hf2 = FindFirstFile(g,&fl2);
cout<<"\n imya faila: "<<fl2.cFileName<<" razmer: "<<fl2.nFileSizeLow<<"\n";
if(fSize < fl2.nFileSizeLow) {fSize = fl2.nFileSizeLow;
strcpy(fName, fl2.cFileName);}
while(FindNextFile(hf2,&fl2))
{
 cout<<"\n imya faila: "<<fl2.cFileName<<" razmer: "<<fl2.nFileSizeLow<<"\n";
 if(fl2.nFileSizeLow > fSize)
    {
    strcpy(fName, fl2.cFileName);
     fSize = fl2.nFileSizeLow;
    }
 
}
cout<<"\n Samiy bolshoy fail: \n"<<"Name: "<<fName<<" Size "<<fSize<<" byte \n";
if(fPrimeSize < fSize){
    pDIR=dir[i];
    strcpy(fpName, fName);
    fPrimeSize = fSize;
cout<<"\n Samiy bolshoy fail iz vseh: \n"<<"Name: "<<fName<<" Size "<<fPrimeSize<<" byte \n"<<" Katalog v kotorom raspolozen: "<<pDIR<<"\n"<<"\n";
}
 
}
 
FindClose(hf);
//-----------------------------
 
SetCurrentDirectory("C:\\CodeBlocks_projects\\lab");
SetCurrentDirectory(pDIR);
GetCurrentDirectory(szDir,dirName);
cout<<"\n Katalog s naydennim failom: \n";
cout<<dirName<<"\n";
cout<<fpName;
HANDLE hF;
int sBuffer = 999999;
char Buffer[sBuffer];
DWORD nl;
hF = CreateFile(fpName,GENERIC_READ,0,NULL,OPEN_ALWAYS,0,NULL);
if(hF==INVALID_HANDLE_VALUE) MessageBox(NULL, TEXT("Нельзя открыть файл!"), TEXT("событие"), 0); //return 1;
 
ReadFile(hF,Buffer,sBuffer,&nl,NULL);
 
cout<<"\n"<<Buffer<<"\n"; //вот как то всё это надо перегнать в массив и взять только последние 3 строки....
 
int n;
scanf("%d",&n);
        return 0;
}
//---------------------------------------------------------------------------
0
30 / 23 / 8
Регистрация: 15.07.2011
Сообщений: 115
15.07.2011, 19:15 3
открываешь файл через CreateFile, устанавливаешь указатель в конец с помощью SetFilePointer (или как-то может по другому функция называется, см. MSDN), затем посимвольно считываешь текст используя ReadFile. Границей строк в тесктовом файле в Windows является пара символов \n\r

Добавлено через 2 минуты
необязательно весь файл перегонять в Переменную Buffer, это нерационально
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.07.2011, 19:15

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Текст в Win32 API
Вывести строку символов в окно программы. Захватить строку нажатием левой кнопки мыши. Переместить...

Библиотека по Win32 API
Посоветуйте справочник с довольно большим количеством функций (Желательно русский)

ComboBox Win32 API
Здравствуйте, для чего нужен ComboBox? В диалоговом окне Я добавил 2 ComboBox и в них запихал радио...

Win32 API Не срабатывает WM_KEYDOWN
Не отрабатывает case WM_KEYDOWN: в 31 строке. #include&lt;Windows.h&gt; #include&quot;resource.h&quot; BOOL...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.