X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHUtils%2FSMESH_File.cxx;h=1e249c43089790f7fb640714a8481b8878445da5;hp=ae5f9bb111868ced9102a16a34266df3b9bdf133;hb=6b5dcfe0005f2a725fd721fe10abd1c3259e25ad;hpb=e09cefb492091eed2987a366e9d607d0078e8cb9 diff --git a/src/SMESHUtils/SMESH_File.cxx b/src/SMESHUtils/SMESH_File.cxx index ae5f9bb11..1e249c430 100644 --- a/src/SMESHUtils/SMESH_File.cxx +++ b/src/SMESHUtils/SMESH_File.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -21,8 +21,8 @@ // Created : Wed Mar 10 11:23:25 2010 // Author : Edward AGAPOV (eap) // + #include "SMESH_File.hxx" -#include "utilities.h" #include #include @@ -36,6 +36,8 @@ #include +#include + namespace boofs = boost::filesystem; //================================================================================ @@ -45,7 +47,13 @@ namespace boofs = boost::filesystem; //================================================================================ SMESH_File::SMESH_File(const std::string& name, bool open) - :_name(name), _size(-1), _file(0), _map(0), _pos(0), _end(0) + :_name(name), _size(-1), +#ifdef WIN32 + _file(INVALID_HANDLE_VALUE), +#else + _file(-1), +#endif + _map(0), _pos(0), _end(0) { if ( open ) this->open(); } @@ -69,16 +77,22 @@ SMESH_File::~SMESH_File() bool SMESH_File::open() { - int length = size(); + long length = size(); if ( !_map && length > 0 ) { #ifdef WIN32 - _file = CreateFile(_name.data(), GENERIC_READ, FILE_SHARE_READ, +# ifdef UNICODE + std::wstring aName = Kernel_Utils::utf8_decode_s(_name); + const wchar_t* name = aName.c_str(); +# else + char* name = _name.data(); +# endif + _file = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); bool ok = ( _file != INVALID_HANDLE_VALUE ); #else _file = ::open(_name.data(), O_RDONLY ); - bool ok = ( _file > 0 ); + bool ok = ( _file >= 0 ); #endif if ( ok ) { @@ -105,6 +119,10 @@ bool SMESH_File::open() #endif } } + else if ( _error.empty() ) + { + _error = "Can't open for reading an existing file " + _name; + } } return _pos; } @@ -134,11 +152,15 @@ void SMESH_File::close() else if ( _file >= 0 ) { #ifdef WIN32 - CloseHandle(_file); - _file = INVALID_HANDLE_VALUE; + if(_file != INVALID_HANDLE_VALUE) { + CloseHandle(_file); + _file = INVALID_HANDLE_VALUE; + } #else - ::close(_file); - _file = -1; + if(_file != -1) { + ::close(_file); + _file = -1; + } #endif } } @@ -154,7 +176,12 @@ bool SMESH_File::remove() close(); boost::system::error_code err; +#if defined(WIN32) && defined(UNICODE) + std::wstring name = Kernel_Utils::utf8_decode_s(_name); + boofs::remove(name.c_str(), err); +#else boofs::remove( _name, err ); +#endif _error = err.message(); return !err; @@ -171,10 +198,15 @@ long SMESH_File::size() if ( _size >= 0 ) return _size; // size of an open file boost::system::error_code err; - uintmax_t size = boofs::file_size( _name, err ); +#if defined(WIN32) && defined(UNICODE) + std::wstring name = Kernel_Utils::utf8_decode_s(_name); + boost::uintmax_t size = boofs::file_size(name.c_str(), err); +#else + boost::uintmax_t size = boofs::file_size( _name, err ); +#endif _error = err.message(); - return err ? -1 : (long) size; + return !err ? (long) size : -1; } //================================================================================ @@ -186,7 +218,13 @@ long SMESH_File::size() bool SMESH_File::exists() { boost::system::error_code err; - bool res = boofs::exists( _name, err ); +#if defined(WIN32) && defined(UNICODE) + std::wstring name = Kernel_Utils::utf8_decode_s(_name); + bool res = boofs::exists(name.c_str(), err); +#else + bool res = boofs::exists(_name, err); +#endif + _error = err.message(); return err ? false : res; @@ -201,7 +239,12 @@ bool SMESH_File::exists() bool SMESH_File::isDirectory() { boost::system::error_code err; +#if defined(WIN32) && defined(UNICODE) + std::wstring name = Kernel_Utils::utf8_decode_s(_name); + bool res = boofs::is_directory(name.c_str(), err); +#else bool res = boofs::is_directory( _name, err ); +#endif _error = err.message(); return err ? false : res; @@ -257,7 +300,7 @@ void SMESH_File::rewind() bool SMESH_File::getInts(std::vector& ints) { - int i = 0; + size_t i = 0; while ( i < ints.size() ) { while ( !isdigit( *_pos ) && !eof()) ++_pos; @@ -276,9 +319,16 @@ bool SMESH_File::getInts(std::vector& ints) bool SMESH_File::openForWriting() { -#ifdef WIN32 + close(); - _file = CreateFile( _name.c_str(), // name of the write +#ifdef WIN32 +#ifdef UNICODE + std::wstring aName = Kernel_Utils::utf8_decode_s(_name); + const wchar_t* name = aName.c_str(); +#else + char* name = _name.data(); +#endif + _file = CreateFile( name, // name of the write GENERIC_WRITE, // open for writing 0, // do not share NULL, // default security @@ -286,7 +336,6 @@ bool SMESH_File::openForWriting() FILE_ATTRIBUTE_NORMAL, // normal file NULL); // no attr. template return ( _file != INVALID_HANDLE_VALUE ); - #else _file = ::open( _name.c_str(), @@ -316,7 +365,7 @@ bool SMESH_File::writeRaw(const void* data, size_t size) #else ssize_t nbWritten = ::write( _file, data, size ); - return ( nbWritten == size ); + return ( nbWritten == (ssize_t) size ); #endif }