using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace PFCRip { public class Startup { static void Main(string[] args) { try { const string SWITCH_PREFIX = "--"; string fileName = String.Empty; bool ignoreErrors = false; bool noDirectoryRecursion = false; //Verify arguments foreach (var arg in args) { if (arg.StartsWith(SWITCH_PREFIX)) { switch (arg.Substring(SWITCH_PREFIX.Length).ToLower()) { case "ignore-errors": { ignoreErrors = true; break; } case "no-dir-recurse": { noDirectoryRecursion = true; break; } default: { throw new InvalidOperationException("Invalid argument: " + arg); } } } else { if (String.IsNullOrEmpty(fileName)) fileName = arg; else throw new InvalidOperationException(String.Format("File name specified twice: {0}, {1}", fileName, arg)); } } //Open file and read in all information Console.WriteLine(String.Format("Reading file {0}...", fileName)); var file = new System.IO.FileStream(fileName, System.IO.FileMode.Open); var data = new byte[file.Length]; file.Read(data, 0, data.Length); file.Close(); //Now create our PFC object var pfc = new PFCFile(data, ignoreErrors); //Now rip out the data pfc.ExtractFavorites(System.IO.Directory.GetCurrentDirectory(), noDirectoryRecursion); Console.WriteLine(); Console.WriteLine("Extraction successful."); } catch (Exception ex) { _DisplayUsage(ex); } } private static void _DisplayUsage() { _DisplayUsage(null); } private static void _DisplayUsage(Exception ex) { var asm = System.Reflection.Assembly.GetExecutingAssembly(); var name = asm.GetName(); Console.WriteLine(name.Name + " v" + name.Version.ToString(3)); Console.WriteLine(); Console.WriteLine("Extracts information from an AOL PFC (Personal File Cabinet) file."); Console.WriteLine("As of right now it really just extracts favorites."); Console.WriteLine(); Console.WriteLine("Usage: " + name.Name + " [switches] [file name]"); Console.WriteLine("Valid switches are:"); Console.WriteLine("\t--ignore-errors Ignores errors in file."); Console.WriteLine("\t--no-dir-recurse Only store directories one level deep."); Console.WriteLine("\t (Works around long file paths.)"); Console.WriteLine(); if (ex != null) Console.WriteLine("ERROR: " + ex.ToString()); } } }