source: pacpusframework/branches/2.0-beta1/src/FileLib/src/DbiteFile.cpp@ 141

Last change on this file since 141 was 141, checked in by Marek Kurdej, 11 years ago

Major update: using Boost.Log if PACPUS_USE_LOG is true.
Added: overloaded operator<< for QString (explicit instantiation).

  • Property svn:executable set to *
File size: 22.4 KB
Line 
1// %pacpus:license{
2// This file is part of the PACPUS framework distributed under the
3// CECILL-C License, Version 1.0.
4// %pacpus:license}
5/// @version $Id: DbiteFile.cpp 76 2013-01-10 17:05:10Z kurdejma $
6
7#include <Pacpus/kernel/DbiteFile.h>
8#include <Pacpus/kernel/DbiteException.h>
9#include <Pacpus/kernel/DbiteFileTypes.h>
10#include <Pacpus/kernel/Log.h>
11
12#include <cassert>
13#include <cmath>
14#include <iostream>
15#include <limits>
16#include <sstream>
17
18using namespace pacpus;
19using namespace std;
20
21// FIXME: record size is only 8-bit long!
22typedef int8_t VariableDataSizeT;
23
24DECLARE_STATIC_LOGGER("pacpus.core.DbiteFile");
25
26namespace pacpus
27{
28 VariableDataSizeTag VariableDataSize;
29 ReadModeTag ReadMode;
30 WriteModeTag WriteMode;
31 DiagnoseModeTag DiagnoseMode;
32}
33
34bool doesFileExist(const string & path);
35
36DbiteFile::DbiteFile()
37 : mIsWriting(false)
38{
39 setPath("");
40
41 (void) ReadMode; // unused
42 (void) WriteMode; // unused
43 (void) VariableDataSize; // unused
44 (void) DiagnoseMode; // unused
45}
46
47DbiteFile::~DbiteFile()
48{
49 if (isOpen()) {
50 close();
51 }
52}
53
54DbiteFile::operator string()
55{
56 static const int64_t kMicrosInSecond = 1000 * 1000;
57 stringstream os;
58
59 os << "Signature : " << getSignature() << endl;
60 os << "Version : " << getVersion() << endl;
61 os << "Header size : " << getDataOffset() << " [bytes]" << endl;
62 os << "Record size : " << getRecordSize() << " [bytes]" << endl;
63 os << "Data type : " << getType() << endl;
64 os << "Time min. : " << getTimeMin() << endl;
65 os << "Time max. : " << getTimeMax() << endl;
66 os << "Duration : " << (getTimeMax() - getTimeMin()) / kMicrosInSecond << " [seconds]" << endl;
67 os << "File size : " << getFileSize() << " [bytes]" << endl;
68 os << "Record count : " << getRecordCount() << endl;
69
70 return os.str();
71}
72
73const string & DbiteFile::getPath() const
74{
75 return mPath;
76}
77
78void DbiteFile::setPath(const string & path)
79{
80 mPath = path;
81}
82
83void DbiteFile::open(const string & path, ReadModeTag)
84{
85 mIsWriting = false;
86 if (isOpen()) {
87 LOG_DEBUG("file is already open, closing...");
88 close();
89 }
90
91 setPath(path);
92
93 mFile.open(getPath().c_str(), ios_base::binary | ios_base::in);
94 try {
95 checkFileOpen();
96 } catch (DbiteException & e) {
97 (void) e; // unused
98 LOG_ERROR("Dbite exception: " << e.what());
99 close();
100 throw DbiteException("cannot open file for reading");
101 }
102
103 try {
104 readHeader();
105 } catch (DbiteException & e) {
106 (void) e; // unused
107 LOG_ERROR("Dbite exception: " << e.what());
108 // TODO: readAndDiagnoseHeader();
109 close();
110 throw DbiteException("cannot read header");
111 }
112 verifyHeader();
113 goToDataBegin();
114}
115
116void DbiteFile::open(const string & path, WriteModeTag)
117{
118 openWriteMode(path);
119}
120
121void DbiteFile::open(const string & path, WriteModeTag, hdfile_header_t::DataTypeT type, hdfile_header_t::DataSizeT dataSize)
122{
123 openWriteMode(path, type);
124 setRecordSize(dataSize);
125}
126
127void DbiteFile::open(const string & path, WriteModeTag, hdfile_header_t::DataTypeT type, VariableDataSizeTag tag)
128{
129 openWriteMode(path, type);
130 setRecordSize(tag);
131}
132
133void DbiteFile::openWriteMode(const string & path, hdfile_header_t::DataTypeT type)
134{
135 openWriteMode(path);
136 setType(type);
137}
138
139void DbiteFile::openWriteMode(const string & path)
140{
141 mIsWriting = true;
142 if (isOpen()) {
143 LOG_DEBUG("file is already open, closing...");
144 close();
145 }
146
147 setPath(path);
148 bool fileExists = doesFileExist(path);
149 ios_base::openmode openmode;
150 if (fileExists) {
151 openmode = ios_base::binary | ios_base::in | ios_base::out;
152 } else {
153 openmode = ios_base::binary | ios_base::out;
154 }
155 mFile.open(getPath().c_str(), openmode);
156 if (!isOpen()) {
157 LOG_ERROR("cannot open file for writing");
158 throw DbiteException("cannot open file for writing");
159 }
160
161 if (fileExists) {
162 // file exists
163 LOG_DEBUG("file already exists, appending");
164 try {
165 readHeader();
166 // TODO: check if same type and record size
167 } catch (DbiteException & e) {
168 (void) e; // unused
169 LOG_ERROR("Dbite exception: " << e.what());
170 // TODO: readAndDiagnoseHeader();
171 close();
172 throw DbiteException("cannot read header");
173 }
174 } else {
175 // file does not exist
176 initializeHeader();
177 writeHeader();
178 }
179 //goToDataBegin();
180 goToFileEnd();
181}
182
183void DbiteFile::initializeHeader()
184{
185 setSignature();
186 setType(FILE_DBT_UNKNOWN);
187 setVersion(VERSION_NUMBER);
188 setDataOffset(sizeof(hdfile_header_t));
189 setRecordSize(0);
190 // same as header size
191 setFileSize(getDataOffset());
192 setTimeMin(numeric_limits<road_time_t>::max());
193 setTimeMax(numeric_limits<road_time_t>::min());
194 setRecordCount(0);
195}
196
197void DbiteFile::close()
198{
199 if (!isOpen()) {
200 LOG_WARN("file is not open");
201 return;
202 }
203 closeDbite();
204 setPath("");
205}
206
207void DbiteFile::closeDbite()
208{
209 if (mIsWriting) {
210 try {
211 writeHeader();
212 } catch (DbiteException & e) {
213 (void) e; // unused
214 LOG_ERROR("cannot write header on close: " << e.what());
215 }
216 }
217 mFile.close();
218}
219
220bool DbiteFile::isOpen() const
221{
222 return mFile.is_open();
223}
224
225void DbiteFile::goToFileBegin()
226{
227 LOG_DEBUG("goToFileBegin()");
228 mFile.clear();
229 setReadPosition(0);
230 setWritePosition(0);
231}
232
233void DbiteFile::goToDataBegin()
234{
235 LOG_DEBUG("goToDataBegin()");
236 LOG_TRACE("getDataOffset() = " << getDataOffset());
237 mFile.clear();
238 setReadPosition(getDataOffset());
239 setWritePosition(getDataOffset());
240}
241
242void DbiteFile::goToFileEnd()
243{
244 LOG_TRACE("goToFileEnd()");
245 LOG_TRACE("getFileSize() = " << getFileSize());
246 mFile.clear();
247 // do not use fstream::seekg/seekp(0, ios_base::end),
248 // because in case of write failure,
249 // we should write at position=getFileSize() which can be before the actual file end
250 setReadPosition(getFileSize());
251 setWritePosition(getFileSize());
252}
253
254int64_t DbiteFile::getReadPosition()
255{
256 checkFileOpen();
257 return mFile.tellg();
258}
259
260int64_t DbiteFile::getWritePosition()
261{
262 checkFileOpen();
263 return mFile.tellp();
264}
265
266void DbiteFile::setReadPosition(int64_t offset, ios_base::seekdir direction)
267{
268 LOG_TRACE("set read position = " << offset << " direction = " << direction);
269 checkFileOpen();
270 mFile.seekg(offset, direction);
271 if (mFile.fail()) {
272 LOG_ERROR("failed to set write position");
273 }
274}
275
276void DbiteFile::setReadPosition(int64_t position)
277{
278 LOG_TRACE("set read position = " << position);
279 checkFileOpen();
280 mFile.seekg(position);
281 if (mFile.fail()) {
282 LOG_ERROR("failed to set read position");
283 }
284}
285
286void DbiteFile::setWritePosition(int64_t offset, ios_base::seekdir direction)
287{
288 LOG_TRACE("set write position = " << offset << " direction = " << direction);
289 checkFileOpen();
290 mFile.seekp(offset, direction);
291 if (mFile.fail()) {
292 LOG_ERROR("failed to set write position");
293 }
294}
295
296void DbiteFile::setWritePosition(int64_t position)
297{
298 LOG_TRACE("set write position = " << position);
299 checkFileOpen();
300 mFile.seekp(position);
301 if (mFile.fail()) {
302 LOG_ERROR("failed to set write position");
303 }
304}
305
306const hdfile_header_t & DbiteFile::getHeader() const
307{
308 return mHeader;
309}
310
311hdfile_header_t & DbiteFile::header()
312{
313 return mHeader;
314}
315
316void DbiteFile::readHeader()
317{
318 goToFileBegin();
319 checkFileOpen();
320 read((char *)(&mHeader), sizeof(mHeader));
321 LOG_DEBUG("file: " << getPath());
322 LOG_TRACE("header read:\n" << string(*this));
323}
324
325void DbiteFile::verifyHeader()
326{
327 // verify file size
328 const int64_t realFileSize = getRealFileSize();
329 const hdfile_header_t::FileSizeT fileSize = getFileSize();
330 if (realFileSize != fileSize) {
331 LOG_WARN("real file size different than header information");
332 LOG_INFO("real file size = " << realFileSize);
333 LOG_INFO("file size = " << fileSize);
334 }
335
336 if (getVersion() != VERSION_NUMBER) {
337 LOG_ERROR("bad version number");
338 throw DbiteException("bad version number");
339 }
340
341 if (!isSignatureCorrect()) {
342 LOG_ERROR("bad signature");
343 throw DbiteException("bad signature");
344 }
345
346 LOG_DEBUG("header verified");
347}
348
349void DbiteFile::writeHeader()
350{
351 LOG_DEBUG("writing header:\n" << string(*this));
352
353 goToFileBegin();
354
355 LOG_DEBUG("begin position=" << getWritePosition());
356
357 const size_t bytesToWrite = sizeof(mHeader);
358 write((char *)(&mHeader), bytesToWrite);
359 LOG_DEBUG("header written");
360
361 LOG_DEBUG("final position=" << getWritePosition());
362}
363
364string DbiteFile::getSignature() const
365{
366 const char signature[] = { getHeader().Signature[0], getHeader().Signature[1], getHeader().Signature[2], getHeader().Signature[3], '\0' };
367 return signature;
368}
369
370bool DbiteFile::isSignatureCorrect() const
371{
372 if ('R' != getHeader().Signature[0]) {
373 return false;
374 }
375 if ('O' != getHeader().Signature[1]) {
376 return false;
377 }
378 if ('A' != getHeader().Signature[2]) {
379 return false;
380 }
381 if ('D' != getHeader().Signature[3]) {
382 return false;
383 }
384 return true;
385}
386
387void DbiteFile::setSignature()
388{
389 header().Signature[0] = 'R';
390 header().Signature[1] = 'O';
391 header().Signature[2] = 'A';
392 header().Signature[3] = 'D';
393}
394
395hdfile_header_t::DataTypeT DbiteFile::getType() const
396{
397 return getHeader().Type;
398}
399
400void DbiteFile::setType(hdfile_header_t::DataTypeT type)
401{
402 header().Type = type;
403}
404
405hdfile_header_t::VersionT DbiteFile::getVersion() const
406{
407 return getHeader().VersionNumber;
408}
409
410void DbiteFile::setVersion(hdfile_header_t::VersionT version)
411{
412 header().VersionNumber = version;
413}
414
415hdfile_header_t::DataOffsetT DbiteFile::getDataOffset() const
416{
417 return getHeader().DataOffset;
418}
419
420void DbiteFile::setDataOffset(hdfile_header_t::DataOffsetT dataOffset)
421{
422 header().DataOffset = dataOffset;
423}
424
425hdfile_header_t::DataSizeT DbiteFile::getRecordSize() const
426{
427 return getHeader().DataSize;
428}
429
430void DbiteFile::setRecordSize(hdfile_header_t::DataSizeT recordSize)
431{
432 header().DataSize = recordSize;
433}
434
435void DbiteFile::setRecordSize(VariableDataSizeTag)
436{
437 header().DataSize = hdfile_header_t::kVariableRecordSize;
438}
439
440hdfile_header_t::FileSizeT DbiteFile::getFileSize() const
441{
442 if (getHeader().FileSize < getHeader().DataOffset) {
443 LOG_WARN("wrong header information: file size lesser than data offset");
444 }
445 return getHeader().FileSize;
446}
447
448void DbiteFile::setFileSize(hdfile_header_t::FileSizeT fileSize)
449{
450 header().FileSize = fileSize;
451}
452
453int64_t DbiteFile::getRealFileSize()
454{
455 checkFileOpen();
456
457 mFile.clear();
458 // save position
459 int64_t oldReadPosition = getReadPosition();
460 int64_t oldWritePosition = getWritePosition();
461
462 // go to file end and get position = file size
463 goToFileEnd();
464 int64_t fileSize = mFile.tellg();
465
466 // restore position
467 setReadPosition(oldReadPosition);
468 setWritePosition(oldWritePosition);
469 return fileSize;
470}
471
472road_time_t DbiteFile::getTimeMin() const
473{
474 return getHeader().TimeMin;
475}
476
477void DbiteFile::setTimeMin(road_time_t time)
478{
479 header().TimeMin = time;
480}
481
482road_time_t DbiteFile::getTimeMax() const
483{
484 return getHeader().TimeMax;
485}
486
487void DbiteFile::setTimeMax(road_time_t time)
488{
489 header().TimeMax = time;
490}
491
492hdfile_header_t::RecordCountT DbiteFile::getRecordCount() const
493{
494 return getHeader().NbRecords;
495}
496
497void DbiteFile::setRecordCount(hdfile_header_t::RecordCountT recourdCount)
498{
499 header().NbRecords = recourdCount;
500}
501
502bool DbiteFile::isVariableDataSize() const
503{
504 return hdfile_header_t::kVariableRecordSize == getRecordSize();
505}
506
507bool DbiteFile::readRecord(size_t recordIndex, road_time_t & time, road_timerange_t & timeRange, char * data, size_t & dataSize)
508{
509 LOG_DEBUG("reading record no. " << recordIndex);
510
511 if (isVariableDataSize()) {
512 LOG_ERROR("cannot read nth record in a variable");
513 throw DbiteException("cannot read nth record in a variable");
514 }
515
516 int64_t nthRecordPosition = getDataOffset() + recordIndex * (getRecordSize() + sizeof(road_time_t) + sizeof(road_timerange_t));
517 LOG_DEBUG(recordIndex << "th record position = " << nthRecordPosition);
518 if (getFileSize() < nthRecordPosition) {
519 LOG_WARN("wanted to read past the file end");
520 //throw DbiteException("wanted to read past the file end");
521 }
522 mFile.clear();
523 setReadPosition(nthRecordPosition);
524
525 return readRecord(time, timeRange, data, dataSize);
526}
527
528bool DbiteFile::readRecord(road_time_t & time, road_timerange_t & timeRange, char * buffer, size_t & bufferSize, const ReadDirection & direction)
529{
530 if (!buffer) {
531 LOG_WARN("data buffer must be a non-NULL pointer");
532 throw DbiteException("data buffer must be a non-NULL pointer");
533 }
534
535 return readRecordNoBufferCheck(time, timeRange, buffer, bufferSize, direction);
536}
537
538bool DbiteFile::readRecord(road_time_t & time, road_timerange_t & timeRange, char * buffer, const ReadDirection & direction)
539{
540 size_t bufferSize = getRecordSize();
541 return readRecord(time, timeRange, buffer, bufferSize, direction);
542}
543
544bool DbiteFile::readRecord(road_time_t & time, road_timerange_t & timeRange, const ReadDirection & direction)
545{
546 size_t bufferSize = 0;
547 return readRecordNoBufferCheck(time, timeRange, (char *) NULL, bufferSize, direction);
548}
549
550bool DbiteFile::readRecordNoBufferCheck(road_time_t & time, road_timerange_t & timeRange, char * buffer, size_t & bufferSize, const ReadDirection & direction)
551{
552 switch (direction) {
553 case ReadForward:
554 return readRecordForward(time, timeRange, buffer, bufferSize);
555 break;
556
557 case ReadBackward:
558 return readRecordBackward(time, timeRange, buffer, bufferSize);
559 break;
560
561 default:
562 assert(false && "wrong ReadDirection parameter");
563 return false;
564 }
565}
566
567bool DbiteFile::readRecordForward(road_time_t & time, road_timerange_t & timeRange, char * buffer, size_t & bufferSize)
568{
569 LOG_TRACE("reading record...");
570 checkFileOpen();
571
572 int64_t initialPosition = getReadPosition();
573 LOG_TRACE("initial position = " << initialPosition);
574
575 ////////////////////////////////////////
576 // read acquisition time
577 mFile.read((char *)(&time), sizeof(time));
578 if (!mFile) {
579 if (isEndOfFile()) {
580 bufferSize = 0;
581 return false;
582 }
583 LOG_ERROR("cannot read acquisition time");
584 throw DbiteException("cannot read acquisition time");
585 }
586
587 ////////////////////////////////////////
588 // read acquisition time range
589 read((char *)(&timeRange), sizeof(timeRange));
590
591 ////////////////////////////////////////
592 // get data and record size
593 size_t dataSize = 0;
594 size_t recordSize = sizeof(time) + sizeof(timeRange);
595 if (isVariableDataSize()) {
596 recordSize += 2 * sizeof(VariableDataSizeT);
597
598 // read record size
599 VariableDataSizeT readVarDataSize = 0;
600 read((char *)(&readVarDataSize), sizeof(VariableDataSizeT));
601 dataSize = static_cast<size_t>(readVarDataSize);
602 LOG_DEBUG("variable record size = " << dataSize);
603 } else {
604 dataSize = getRecordSize();
605 }
606 recordSize += dataSize;
607
608 ////////////////////////////////////////
609 // read/skip data
610 if (buffer) {
611 if (bufferSize < dataSize) {
612 LOG_WARN("buffer is smaller than the record size");
613 LOG_INFO("buffer size = " << bufferSize);
614 LOG_INFO("data size = " << dataSize);
615 throw DbiteException("buffer is smaller than the data size");
616 // TODO: don't throw exception, but read only as much data as possible
617 }
618
619 // read data
620 read(buffer, dataSize);
621
622 if (isVariableDataSize()) {
623 // read record size
624 VariableDataSizeT readVarDataSize = 0;
625 read((char *)(&readVarDataSize), sizeof(VariableDataSizeT));
626 size_t varDataSize = static_cast<size_t>(readVarDataSize);
627 LOG_TRACE("variable record size = " << varDataSize);
628
629 if (dataSize != varDataSize) {
630 LOG_WARN("corrupted data: data sizes differ");
631 LOG_INFO("data size (before) = " << dataSize);
632 LOG_INFO("data size (after) = " << varDataSize);
633 }
634 }
635 } else {
636 // skip data
637 setReadPosition(dataSize, ios_base::cur);
638 if (isVariableDataSize()) {
639 setReadPosition(dataSize, ios_base::cur);
640 }
641 }
642
643 ////////////////////////////////////////
644 // check how many bytes were read/skipped
645 int64_t positionDifference = getReadPosition() - initialPosition;
646 if (positionDifference != recordSize) {
647 LOG_WARN("should be read : " << recordSize << " [bytes]");
648 LOG_WARN("was actually read: " << positionDifference << " [bytes]");
649 }
650 return true;
651}
652
653bool DbiteFile::readRecordBackward(road_time_t & time, road_timerange_t & timeRange, char * buffer, size_t & bufferSize)
654{
655 int64_t initialPosition = getReadPosition();
656 LOG_TRACE("initial position = " << initialPosition);
657
658 size_t dataSize = 0;
659 size_t recordSize = sizeof(time) + sizeof(timeRange);
660 if (isVariableDataSize()) {
661 recordSize += 2 * sizeof(VariableDataSizeT);
662
663 // go back sizeof(VariableDataSizeT)
664 setReadPosition(initialPosition - sizeof(VariableDataSizeT));
665
666 // read VariableDataSizeT
667 VariableDataSizeT readVarDataSize = 0;
668 read((char *)(&readVarDataSize), sizeof(VariableDataSizeT));
669 dataSize = static_cast<size_t>(readVarDataSize);
670 LOG_DEBUG("variable record size = " << dataSize);
671 } else {
672 dataSize = getRecordSize();
673 }
674 // recordSize = sizeof(time) + sizeof(timeRange) + dataSize + [2 * sizeof(VariableDataSizeT)]
675 recordSize += dataSize;
676
677 // go back to the beginning of the previous record
678 setReadPosition(initialPosition - recordSize);
679
680 bool readResult = false;
681 try {
682 // read forward
683 readResult = readRecordForward(time, timeRange, buffer, bufferSize);
684 } catch (DbiteException & e) {
685 setReadPosition(initialPosition);
686 throw e;
687 }
688
689 // go back to the beginning of the previous record
690 setReadPosition(initialPosition - recordSize);
691 return readResult;
692}
693
694bool DbiteFile::writeRecord(const road_time_t & time, const road_timerange_t & timeRange, const char * data, const size_t dataSize)
695{
696 LOG_DEBUG("writing record:" << "\t"
697 << "time=" << time << "\t"
698 << "time range=" << timeRange << "\t"
699 << "data size=" << dataSize);
700 checkFileOpen();
701
702 if (isVariableDataSize()) {
703 if (dataSize > static_cast<size_t>(numeric_limits<VariableDataSizeT>::max())) {
704 LOG_ERROR("variable data size too big");
705 throw DbiteException("variable data size too big");
706 }
707 }
708
709 int64_t initialPosition = getWritePosition();
710 LOG_TRACE("getFileSize() = " << getFileSize());
711 LOG_TRACE("getWritePosition() = " << getWritePosition());
712 assert(initialPosition == getFileSize());
713
714 size_t writtenBytes = 0;
715 try {
716 // write acquisition time, acquisition time range, data
717 // if variable size, then write record size before and after data
718
719 write((const char *)(&time), sizeof(time));
720 writtenBytes += sizeof(time);
721
722 write((const char *)(&timeRange), sizeof(timeRange));
723 writtenBytes += sizeof(timeRange);
724
725 if (isVariableDataSize()) {
726 write((const char *)(&dataSize), sizeof(VariableDataSizeT));
727 writtenBytes += sizeof(VariableDataSizeT);
728 }
729 write((const char *)(data), dataSize);
730 writtenBytes += dataSize;
731
732 if (isVariableDataSize()) {
733 write((const char *)(&dataSize), sizeof(VariableDataSizeT));
734 writtenBytes += sizeof(VariableDataSizeT);
735 }
736 } catch (DbiteException & e) {
737 LOG_ERROR("Dbite exception: " << e.what());
738 LOG_INFO("restoring initial write position");
739
740 // on error, go back to record start
741 setWritePosition(- (int64_t) writtenBytes, ios_base::cur);
742 throw e;
743 }
744
745 // check how many bytes were written
746 int64_t finalPosition = getWritePosition();
747 int64_t positionDifference = finalPosition - initialPosition;
748 LOG_TRACE("position difference = " << positionDifference);
749 size_t totalRecordSize = dataSize + sizeof(time) + sizeof(timeRange);
750
751 setFileSize(finalPosition); // FIXME: possible loss of data, conversion int64_t -> FileSizeT
752 setRecordCount(getRecordCount() + 1);
753 setTimeMin(min(getTimeMin(), time));
754 setTimeMax(max(getTimeMax(), time));
755
756 if (positionDifference != totalRecordSize) {
757 LOG_WARN("should be written : " << totalRecordSize << " [bytes]");
758 LOG_WARN("was actually written: " << positionDifference << " [bytes]");
759 }
760 return true;
761}
762
763void DbiteFile::read(fstream::char_type * s, streamsize n)
764{
765 mFile.read(s, n);
766 if (!mFile) {
767 LOG_ERROR("cannot read data");
768 throw DbiteException("cannot read data");
769 }
770}
771
772void DbiteFile::write(const fstream::char_type * s, streamsize n)
773{
774 mFile.write(s, n);
775 if (!mFile) {
776 LOG_ERROR("cannot write data");
777 throw DbiteException("cannot write data");
778 }
779}
780
781bool DbiteFile::isEndOfFile()
782{
783 return mFile.eof();
784}
785
786void DbiteFile::checkFileOpen()
787{
788 if (!isOpen()) {
789 string errorMessage = "file is not open";
790 LOG_WARN(errorMessage);
791 throw DbiteException(errorMessage.c_str());
792 }
793}
794
795bool doesFileExist(const string & path)
796{
797 bool fileExist = false;
798 fstream f(path.c_str(), ios_base::in);
799 if (f.good()) {
800 fileExist = true;
801 }
802 f.close();
803 return fileExist;
804}
Note: See TracBrowser for help on using the repository browser.