[C++]20. C++ 파일크기 구하기
안녕하세요 고급 개발자가 꿈인 코린이 입니다.
오늘은 c++에서 파일의 크기를 구하는 방법에 대해서 포스팅 하겠습니다.
지난번 포스팅에서 데이터 버퍼에 정보를 저장하고 파일로 저장하는 로직을 구현했었는데요
오늘은 지난번 포스팅에서 구현한 내용에서 조금더 심화해서 파일 저장후 특정한 파일 사이즈가 넘거나 특정한 파일
사이즈가 되면 다른 파일을 생성해서 다시 파일에 저장하는 내용을 다루어 보겠습니다.
아래 url은 지난번에 구현하 데이터 버퍼에 정보를 저장하고 파일로 저장하는 내용입니다.
참고해주시면 감사하겠습니다.
https://youonlyliveonce1.tistory.com/72
오늘 구현할 내용은 데이터 버퍼에 저장한후 파일로 저장한뒤에 이 파일이 3kb가 넘으면 새로운 파일을 만들고
다시 새로운 파일에 버퍼에 저장한 내용을 저장하는 내용을 구현하겠습니다.
ServiceClass.hpp
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
|
#ifndef SERVICECLASSCECLASS_H
#define SERVICECLASSCECLASS_H
#include <iostream>
#include <vector>
#include <sstream>
#include <fstream>
class ServiceClass
{
public:
ServiceClass();
virtual ~ServiceClass();
private:
int mNum = 0;
std::ostringstream mDataBuffer;
std::ofstream mFile;
int mCount = 0;
int mFileCount = 0;
std::string mFileName;
std::string mFileFormat = ".txt";
public:
void saveDataBuffer(const char* data);
std::int32_t fileSize(std::string fileName); //파일의 크기를 리턴해주는 함수
};
#endif // SERVICECLASSCECLASS_H
|
cs |
ServiceClass.cpp
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
|
#include "ServiceClass.h"
#include <string.h>
#include <sys/stat.h>
#include <thread>
#include <unistd.h>
#define DATA_FILE "/home/shin/youonlyliveonce/dataBuffer"
ServiceClass::ServiceClass()
{
mFileName = DATA_FILE;
std::thread sendDataBuffer([&]() {//새로운 쓰레드를 만들어서 1초에 한번씩 쓰레드를 돌린다.
std::cout << "sendDataBuffer "<<std::endl;
bool loop = true;
while(loop){
std::string strValue;
mNum++;
for(int i = 0; i < mNum; i++)
{
strValue += std::to_string(i);//데이터를 1부터 추가되는 숫자까지 모두 변수에 넣어둔다.
if(i != mNum - 1){
strValue += ",";
}
std::cout << "strValue:" << strValue <<std::endl;
}
saveDataBuffer(strValue.c_str());//변수에 담은 내용을 데이터 버퍼에 담는다.
if (true == loop) {
sleep(1); // 1second
}
}
});
sendDataBuffer.detach();
}
ServiceClass::~ServiceClass()
{
}
void ServiceClass::saveDataBuffer(const char* data)
{
std::cout << "saveDataBuffer:" << data <<std::endl;
mFile.open(mFileName + mFileFormat);
mDataBuffer <<data<< std::endl; // save data buffer
mFile << mDataBuffer.str();//데이터 버퍼에 담은 내용을 파일에 저장한다.
mFile.close();
if(fileSize(mFileName + mFileFormat) > 3 * 1024){ // 3kb이상이면 새로운 파일을 만들고 데이더 버퍼에 담긴 내용을 초기화 해준다.
mFileCount++;
mFileName = DATA_FILE + std::to_string(mFileCount);
mDataBuffer.str("");//버퍼에 담긴 내용을 초기화 해준다.
mDataBuffer.clear();//clear함수만 사용해서는 버퍼의 내용이 초기화가 안된다.
std::cout << "new file!! fileName:" << mFileName <<std::endl;
}
}
int32_t ServiceClass::fileSize(std::string fileName)
{
std::cout << "fileSize() fileName:" << fileName <<std::endl;
struct stat _stat;
int32_t rc = stat(fileName.c_str(), &_stat);
std::int32_t returnValue;
if(rc == 0){
returnValue = _stat.st_size;//파일의 크기를 구해준다.
}else{
returnValue = -1;
}
std::cout << "fileSize() returnValue:" << returnValue <<std::endl;
return returnValue;
}
|
cs |
실행 결과
위의 실행 결과 이미지를 보시면 파일사이즈 로그를 찍은 내용에 3093d이라고 찍혀있는것을 확인할수가 있고
실제 저장된 dataBuffer.txt의 파일크기도 3,093 바이트 인것을 확인할수가 있습니다.
그리고 파일크기가 3000 바이트가 넘었을때 새로운 파일이 생성되는것도 확인할수가 있습니다.
저의 소스코드에서 파일의 크기를 가져오는 내용은 아래와 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
|
std::cout << "fileSize() fileName:" << fileName <<std::endl;
struct stat _stat;
int32_t rc = stat(fileName.c_str(), &_stat);
std::int32_t returnValue;
if(rc == 0){
returnValue = _stat.st_size;//파일의 크기를 구해준다.
}else{
returnValue = -1;
}
std::cout << "fileSize() returnValue:" << returnValue <<std::endl;
return returnValue;
|
cs |
위의 소스코드처럼 struct stat를 이용해서 stat 함수를 이용해서 파일 이름을 넣고 이 파일의 상태를 리턴해주는
구조체 stat를 이용해서 파일의 크기를 구할수가 있습니다. 이 구조체의 st_size를 확인해보면 파일의 크기를
구할수 있는것을 확인할수가 있습니다.
그리고 3kb이상이면 새로운 파일을 만들고 데이퍼 버퍼를 초기화 시켜서 파일을 저장하는 내용은
아래 소스코드를 사용하였습니다.
1
2
3
4
5
6
7
|
if(fileSize(mFileName + mFileFormat) > 3 * 1024){ // 3kb이상이면 새로운 파일을 만들고 데이더 버퍼에 담긴 내용을 초기화 해준다.
mFileCount++;
mFileName = DATA_FILE + std::to_string(mFileCount);
mDataBuffer.str("");//버퍼에 담긴 내용을 초기화 해준다.
mDataBuffer.clear();//clear함수만 사용해서는 버퍼의 내용이 초기화가 안된다.
std::cout << "new file!! fileName:" << mFileName <<std::endl;
}
|
cs |
위의 3 * 1024 즉 3kb이상이면 새로운 파일을 만들고 데이터 버퍼를 초기화 해주는 내용을 구현하였습니다.
여기까지 데이터 버퍼에 데이터를 저장하고 이 데이터를 파일에 저장한뒤에 특정한 파일 크기가 되면 새로운 파일을
만들어서 저장하는 내용까지 다루어 보았습니다.
실무에서도 실시간으로 데이터를 저장한다는 등 이러한 내용을 많이 사용합니다.
잘 익혀뒤면 실무나 필요한 내용에 꼭 필요한 내용입니다.
여기까지 읽어주셔서 감사합니다.
'C++ > C++심화' 카테고리의 다른 글
[C++]21. C++ unsigned char 포인터 형변환하기(unsigned char* to string) (0) | 2020.10.24 |
---|---|
[C++]19. C++ 데이터 버퍼에 정보를 저장하기(데이터 버퍼에 정보를 저장하고 파일로 저장하기) (0) | 2020.07.05 |
[C++]18. C++에서 파일의 존재 여부 확인 하기 (0) | 2020.04.15 |
[C++]17. string 데이터를 int형 데이터로 변경하는 방법(string to int) (0) | 2020.04.11 |
[C++]16. int형 데이터를 string 형 데이터로 변경(int to string) (0) | 2020.04.11 |