public static void createStorageLocations () {
        File cacheDir = new File(OSUtils.getCacheStorageLocation());
        File dynamicDir = new File(OSUtils.getDynamicStorageLocation());

        if (!cacheDir.exists()) {
            cacheDir.mkdirs();

            if (dynamicDir.exists() && !cacheDir.equals(dynamicDir)) {
                // Migrate cached archives from the user's roaming profile to their local cache

                Logger.logInfo("Migrating cached Maps from Roaming to Local storage");
                FTBFileUtils.move(new File(dynamicDir, "Maps"), new File(cacheDir, "Maps"));

                Logger.logInfo("Migrating cached Modpacks from Roaming to Local storage");
                FTBFileUtils.move(new File(dynamicDir, "ModPacks"), new File(cacheDir, "ModPacks"));

                Logger.logInfo("Migrating cached Texturepacks from Roaming to Local storage");
                FTBFileUtils.move(new File(dynamicDir, "TexturePacks"), new File(cacheDir, "TexturePacks"));

                Logger.logInfo("Migration complete.");
            }
        }

        if (!dynamicDir.exists()) {
            dynamicDir.mkdirs();
        }

        if (getCurrentOS() == OS.WINDOWS) {
            File oldLoginData = new File(dynamicDir, "logindata");
            File newLoginData = new File(cacheDir, "logindata");
            try {
                if (oldLoginData.exists() && !oldLoginData.getCanonicalPath().equals(newLoginData.getCanonicalPath())) {
                    newLoginData.delete();
                }
            } catch (Exception e) {
                Logger.logError("Error deleting login data", e);
            }
        }
    }