Boost logo

Boost :

Subject: Re: [boost] Making Boost.Filesystem work with GENERAL filenames with g++ in Windows (a solution)
From: Artyom Beilis (artyomtnk_at_[hidden])
Date: 2011-10-26 05:47:39


  ----- Original Message ----- > From: Alf P. Steinbach <alf.p.steinbach+usenet_at_[hidden]> > > First, apologies if I'm posting to the wrong group/list; if so then please > redirect me. > > IMHO access to files is a crucial part of Boost.Filesystem. However, with Boost > 1.47, and using g++ 4.4.1 in Windows 7, boost::filesystem::ifstream etc. fail to > open or create files with non-ANSI characters. It works fine with Visual C++; it > FAILS with g++ 4.4.1, which is the one bundled with the Code::Blocks IDE. > > The failure probably has nothing to do with the g++ version: it's due to g++ > not offering the Visual C++ wchar_t oriented extensions to the standard > iostreams (Boost.Filesystem uses these Visual C++ extensions). > > I stumbled onto this while I was writing about using Unicode in C++ programming > in Windows. > Why just not to implement boost::filesystem::fstream over _wfopen and custom streambuf implementation? It is relatively simple. I have implemented such thing under booster namespace as part of cppcms project http://cppcms.svn.sourceforge.net/viewvc/cppcms/framework/trunk/booster/booster/nowide/ http://cppcms.svn.sourceforge.net/viewvc/cppcms/framework/trunk/booster/lib/nowide/src/ http://cppcms.svn.sourceforge.net/viewvc/cppcms/framework/trunk/booster/booster/nowide/fstream.h?revision=1967&view=markup > I wrote up a technical solution in section 5, starting on page 16, of that > work-in-progress document, available on Google Docs at: > > > https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=0B2oiI2reHOh4ZjdkNmUyNDctNzI1Yi00NmJjLThiMzgtYmI3OGE0ZmE5MDg2&hl=en > > Essentially, the fix I ended up with, full source code given in the above doc, > uses Windows short file names if (1) there is no wide character support and if > furthermore (2) the filename can't be perfectly translated to ANSI. The C++ > implementation's support for wide chars is automatically detected using > C++98-compatible code. > > I do not know what to do with this. > That is what very good about stream buffers... You can implement anything you need. Using short file names is no go for two reasons: 1. It works only when file exists (can't create new file) 2. It is quite deprecated > But considering that Boost.Filesystem is slated for later inclusion in the C++ > standard library (or at least into TR2), I think it would be nice if it is able > to give access to all accessible files in Windows, also with g++, This is a problem that can be fixed easily in Boost.Filesystem. > so that we > don't end up with a file handling part of the standard library that > can't handle files in general; This is a "bug" in Windows operating system... but this is other story. > hence this posting and plea for advice  --  > what more should I do, if anything? > Write a patch that implements stream buffer over stdio and _wfopen? > Cheers, > > - Alf > Artyom Beilis -------------- CppCMS - C++ Web Framework: http://cppcms.sf.net/ CppDB - C++ SQL Connectivity: http://cppcms.sf.net/sql/cppdb/>


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk