1 // Common/ListFileUtils.cpp 2 3 #include "StdAfx.h" 4 5 #include "MyWindows.h" 6 #include "../Windows/FileIO.h" 7 8 #include "ListFileUtils.h" 9 #include "StringConvert.h" 10 #include "UTFConvert.h" 11 12 static const char kQuoteChar = '\"'; 13 static void RemoveQuote(UString &s) 14 { 15 if (s.Length() >= 2) 16 if (s[0] == kQuoteChar && s[s.Length() - 1] == kQuoteChar) 17 s = s.Mid(1, s.Length() - 2); 18 } 19 20 bool ReadNamesFromListFile(LPCWSTR fileName, UStringVector &resultStrings, UINT codePage) 21 { 22 NWindows::NFile::NIO::CInFile file; 23 if (!file.Open(fileName)) 24 return false; 25 UInt64 length; 26 if (!file.GetLength(length)) 27 return false; 28 if (length > ((UInt32)1 << 31)) 29 return false; 30 AString s; 31 char *p = s.GetBuffer((int)length + 1); 32 UInt32 processed; 33 if (!file.Read(p, (UInt32)length, processed)) 34 return false; 35 p[(UInt32)length] = 0; 36 s.ReleaseBuffer(); 37 file.Close(); 38 39 UString u; 40 #ifdef CP_UTF8 41 if (codePage == CP_UTF8) 42 { 43 if (!ConvertUTF8ToUnicode(s, u)) 44 return false; 45 } 46 else 47 #endif 48 u = MultiByteToUnicodeString(s, codePage); 49 if (!u.IsEmpty()) 50 { 51 if (u[0] == 0xFEFF) 52 u.Delete(0); 53 } 54 55 UString t; 56 for (int i = 0; i < u.Length(); i++) 57 { 58 wchar_t c = u[i]; 59 if (c == L'\n' || c == 0xD) 60 { 61 t.Trim(); 62 RemoveQuote(t); 63 if (!t.IsEmpty()) 64 resultStrings.Add(t); 65 t.Empty(); 66 } 67 else 68 t += c; 69 } 70 t.Trim(); 71 RemoveQuote(t); 72 if (!t.IsEmpty()) 73 resultStrings.Add(t); 74 return true; 75 } 76