Windows C++: Handling unicode file names

The Problem
In C++, I used to use ifstream and ofstream to read and write file, to determine file existence.

But in recent project, as the file name may be unicode, we need use wide string, wchar_t.  Just find out that ifstream and ofstream doesn't work with unicode file name.

The program is simple: it checks whether one file exists, if not, write some text into it, if exists, do nothing.
The code that doesn't work

void codeDoesnotwork()
{
 wchar_t* filePath =L"E:\\tmp\\test.txt";
 ifstream infile(filePath);
 if (!infile.is_open() || 
  !infile.good())
 {
  cout << "file doesn't exist" << endl;
 }
 else
 {
  // it alwalys goes here, even the file doesn't exist.
  cout << "file exists" << endl;
 }

 // ofstream << or write doens't work.
 ofstream ofs(filePath,ios::out | ios::trunc);
 ofs<< "hello world!" << endl;
 ofs.write("1", 1);
 ofs.close();
}
This is because ifstream and ofstream doesn't work with wide string.
The code that works
using namespace std;
typedef unsigned int uint;
void codeThatWorks()
{
 wchar_t *installFolder=L"E:\\tmp";
 wchar_t *fileName = L"test.txt";
 uint fileNameBufferSize = wcslen(installFolder) + wcslen(fileName) + 2;

 wchar_t *fileNameBuffer = new wchar_t[fileNameBufferSize];
 assert(fileNameBuffer);
 memset(fileNameBuffer, 0, fileNameBufferSize * sizeof(wchar_t)); 
 swprintf_s(fileNameBuffer, fileNameBufferSize, L"%s/%s", installFolder, fileName);

 FILE* oFile;
 oFile = _wfopen(fileNameBuffer,L"r");
 if(oFile==NULL)
 {
  cout << "file doesn't exist" << endl;
  //FILE* oFile;
  oFile = _wfopen(fileNameBuffer,L"w+");
  fprintf(oFile,"%s", "hello world");  
 }
 else
 {
  cout << "file exists" << endl;
 }
 fclose(oFile);
 delete[] fileNameBuffer;
}
Write Unicode Content to File
If we need write unicode content to file, we should use  _wfopen or wofstream to write wide string to file.
f = _wfopen(COMMON_FILE_PATH,L"w, ccs=UTF-16LE");

Use Shlwapi.lib PathFileExists
We can use Shlwapi.lib's PathFileExists to check file existence:
BOOL exist = PathFileExists(fileNameBuffer);
Also in order to use Shlwapi.h, we need add Shlwapi.lib library by right clicking the project -> "Configuration Properties" -> "Linker" -> "Input" -> "Additional Dependencies" -> "Edit" -> type "Shlwapi.lib" in the text box.

Resource
MSDN fopen, _wfopen
Wrote to a file using std::wofstream
Post a Comment

Labels

Java (159) Lucene-Solr (112) Interview (61) All (58) J2SE (53) Algorithm (45) Soft Skills (38) Eclipse (33) Code Example (31) Linux (25) JavaScript (23) Spring (22) Windows (22) Web Development (20) Tools (19) Nutch2 (18) Bugs (17) Debug (16) Defects (14) Text Mining (14) J2EE (13) Network (13) Troubleshooting (13) PowerShell (11) Chrome (9) Design (9) How to (9) Learning code (9) Performance (9) Problem Solving (9) UIMA (9) html (9) Http Client (8) Maven (8) Security (8) bat (8) blogger (8) Big Data (7) Continuous Integration (7) Google (7) Guava (7) JSON (7) Shell (7) ANT (6) Coding Skills (6) Database (6) Lesson Learned (6) Programmer Skills (6) Scala (6) Tips (6) css (6) Algorithm Series (5) Cache (5) Dynamic Languages (5) IDE (5) System Design (5) adsense (5) xml (5) AIX (4) Code Quality (4) GAE (4) Git (4) Good Programming Practices (4) Jackson (4) Memory Usage (4) Miscs (4) OpenNLP (4) Project Managment (4) Spark (4) Testing (4) ads (4) regular-expression (4) Android (3) Apache Spark (3) Become a Better You (3) Concurrency (3) Eclipse RCP (3) English (3) Happy Hacking (3) IBM (3) J2SE Knowledge Series (3) JAX-RS (3) Jetty (3) Restful Web Service (3) Script (3) regex (3) seo (3) .Net (2) Android Studio (2) Apache (2) Apache Procrun (2) Architecture (2) Batch (2) Bit Operation (2) Build (2) Building Scalable Web Sites (2) C# (2) C/C++ (2) CSV (2) Career (2) Cassandra (2) Distributed (2) Fiddler (2) Firefox (2) Google Drive (2) Gson (2) How to Interview (2) Html Parser (2) Http (2) Image Tools (2) JQuery (2) Jersey (2) LDAP (2) Life (2) Logging (2) Python (2) Software Issues (2) Storage (2) Text Search (2) xml parser (2) AOP (1) Application Design (1) AspectJ (1) Chrome DevTools (1) Cloud (1) Codility (1) Data Mining (1) Data Structure (1) ExceptionUtils (1) Exif (1) Feature Request (1) FindBugs (1) Greasemonkey (1) HTML5 (1) Httpd (1) I18N (1) IBM Java Thread Dump Analyzer (1) JDK Source Code (1) JDK8 (1) JMX (1) Lazy Developer (1) Mac (1) Machine Learning (1) Mobile (1) My Plan for 2010 (1) Netbeans (1) Notes (1) Operating System (1) Perl (1) Problems (1) Product Architecture (1) Programming Life (1) Quality (1) Redhat (1) Redis (1) Review (1) RxJava (1) Solutions logs (1) Team Management (1) Thread Dump Analyzer (1) Visualization (1) boilerpipe (1) htm (1) ongoing (1) procrun (1) rss (1)

Popular Posts