Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Efremovs
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 7
31.08.2013, 21:19     Как определить размер открытого файла #1
Как определить размер открытого файла. Я заметил, что если запустить программу для определения размера файла каждые 30с , то размер будет одинаковым(если при этом размер уменьшится/увеличится), либо появится ошибки.
Помогите реализовать это.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2013, 21:19     Как определить размер открытого файла
Посмотрите здесь:

C++ Определить размер файла в С++
C++ как изменить размер открытого для записи файла
C++ Как определить размер класса ?
Как определить размер класса? C++
C++ Как определить размер файла свыше 4Гб?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dmitry94
517 / 187 / 34
Регистрация: 25.05.2012
Сообщений: 780
31.08.2013, 22:32     Как определить размер открытого файла #2
Цитата Сообщение от Efremovs Посмотреть сообщение
Я заметил, что если запустить программу для определения размера файла каждые 30с , то размер будет одинаковым(если при этом размер уменьшится/увеличится)
Откуда уверенность, что размер файла увеличивается/уменьшается? Приведите конкретный пример.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
31.08.2013, 22:36     Как определить размер открытого файла #3
C
1
2
    struct stat file_stat;
    fstat(fd, &file_stat);
В file_stat.st_size размер в байтах
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.08.2013, 23:42     Как определить размер открытого файла #4
Цитата Сообщение от Efremovs Посмотреть сообщение
если при этом размер уменьшится/увеличится
Не забывайте, что файловый ввод/вывод буферизирован и чтобы выполненные изменения попали из буфера в файл, нужно произвести определённые действия.
Efremovs
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 7
01.09.2013, 12:31  [ТС]     Как определить размер открытого файла #5
Цитата Сообщение от 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");
dmitry94
517 / 187 / 34
Регистрация: 25.05.2012
Сообщений: 780
01.09.2013, 16:59     Как определить размер открытого файла #6
Цитата Сообщение от Efremovs Посмотреть сообщение
Происходит зацикливание кода, где проверяется размер файла и отправка на емаил. Так вот, когда файл достигает нужного размера он начинает отправлять много писем на емаил, хотя старый файл должен удалится. Почему он не удаляет? Помогите
Я так понял, что какой-то другой процесс пишет данные в файл. Возможно при попытке удаления файл не закрыт и по этому удалить его нельзя. Смотрите GetLastError после выполнения DeleteFile.
Efremovs
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 7
01.09.2013, 21:50  [ТС]     Как определить размер открытого файла #7
Нет, этот процесс пишет в файл. Я скопировал только часть кода.

Добавлено через 2 минуты
К слову, я примерно такую программу писал год назад на C#. Если честно, там намного проще было отправлять файл на почту, считывать размер, удалять и т.д..
Efremovs
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 7
10.09.2013, 21:19  [ТС]     Как определить размер открытого файла #8
Нету решения этой проблемы?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2013, 02:26     Как определить размер открытого файла
Еще ссылки по теме:

C++ чтение данных из открытого файла (fread)
Как узнать размер открытого файла C++
Как узнать текущий размер файла, открытого для записи? C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.09.2013, 02:26     Как определить размер открытого файла #9
Цитата Сообщение от 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();
Только не вижу, где там изменение размера файла? Если тут это не показано, значит дело в коде, который изменяет размер файла, ведь без него, у меня, работает.
Миниатюры
Как определить размер открытого файла  
Yandex
Объявления
11.09.2013, 02:26     Как определить размер открытого файла
Ответ Создать тему
Опции темы

Текущее время: 13:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru