source: pacpusframework/trunk/src/FileLib/src/DbiteFile.cpp@ 64

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

Modified property: added svn:keywords=Id.

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