/* Splittet .vcf-Datei aus Apple iPhone in einzelne Dateien.
Der Aufruf dieses Programms findet alle *.vcf-Dateien
im aktuellen Verzeichnis und generiert *.vcf-Dateien im Unterverzeichnis vcf.
Dabei werden die Dateinamen aus dem FN:-Eintrag (FullName) gewonnen,
bei mehrfachen Einträgen mit gleichem FN: mit angehängter Nummer in Klammern.
Dabei können Dateien gleichen Inhalts entstehen.
210920 erstellt, Echse-Größe = 2,5 KByte
-210921 Liste der verbotenen Zeichen bei FAT/NTFS
*/
#include <stdio.h>
#include <wchar.h>
#include <windows.h> // MultiByteToWideChar()
void mainCRTStartup() {
WIN32_FIND_DATAW fd;
HANDLE hf=FindFirstFileW(L"*.vcf",&fd);
if (hf==INVALID_HANDLE_VALUE) {
wchar_t msg[256];
swprintf(msg,L"Kein %s gefunden!",L"*.vcf");
_wperror(msg);
exit(1);
}
int i=0;
CreateDirectoryW(L"vcf",0); // Verzeichnis für Zieldateien (zwecks Ordnung) erstellen
for(;;){
FILE*f=_wfopen(fd.cFileName,L"r");
if (!f) {
wchar_t msg[256];
swprintf(msg,L"Kann Datei %s nicht öffnen, Fehlerkode %d!",fd.cFileName,errno);
_wperror(msg);
}
char line[256];
wchar_t tmpname[16],name[256];
FILE*f2=0; // Zieldatei
while (fgets(line,sizeof line,f)) {
size_t l=strlen(line);
if (line[l-1]=='\n') line[--l]=0; // Lästiges "\n" am Zeilenende entfernen
if (!strcmp(line,"BEGIN:VCARD")) { // Bei "Beginn einer VCARD" …
swprintf(tmpname,L"vcf/%03i.vcf",i);// temporäre Datei erzeugen
f2=_wfopen(tmpname,L"w");
}
if (f2) {
fprintf(f2,"%s\n",line); // … alles hineinkopieren
if (!memcmp(line,"FN:",3)) { // Zieldateiname (Unicode!!) generieren
MultiByteToWideChar(CP_UTF8,0,line+3,-1,name,256); // Gegeben in UTF-8
for (wchar_t*p=name,*q=name;;p++) {
if (!wcschr(L"\\/\"*?<>|",*p)) *q++=*p; // Illegale Win32-Zeichen entfernen
if (!*p) break;
}
}
}
if (!strcmp(line,"END:VCARD")) { // beim Ende Datei schließen …
if (f2) {
fclose(f2);
f2=0;
i++;
if (*name) { // … und (bei Vorhandensein von FN: == FullName) umbenennen
wchar_t newname[256];
swprintf(newname,L"vcf/%s.vcf",name);
bool okay=!_wrename(tmpname,newname); // manche Fullnames sind mehrfach
if (!okay && errno==17/*EEXIST*/) { // nochmal mit angehängter Nummer versuchen
swprintf(newname,L"vcf/%s (%i).vcf",name,i);
okay=!_wrename(tmpname,newname); // jetzt sollte es klappen
}
if (!okay) { // Fehler beim Umbenennen (keine mehr)
wchar_t msg[256];
swprintf(msg,L"Fehler %d beim Umbenennen von %s in %s",errno,tmpname,newname);
_wperror(msg);
}
*name=0;
}
}
}
}
fclose(f);
if (!FindNextFileW(hf,&fd)) break;
}
FindClose(hf);
exit(0);
}
Detected encoding: ANSI (CP1252) | 4
|
|