public static MobileProvisionIndex CreateIndex(string profilesDir, string indexName)
        {
            var index = new MobileProvisionIndex();

            if (Directory.Exists(profilesDir))
            {
                foreach (var fileName in Directory.EnumerateFiles(profilesDir))
                {
                    if (!fileName.EndsWith(".mobileprovision", StringComparison.Ordinal) && !fileName.EndsWith(".provisionprofile", StringComparison.Ordinal))
                    {
                        continue;
                    }

                    try {
                        var profile = ProvisioningProfile.Load(fileName);
                        index.ProvisioningProfiles.Add(profile);
                    } catch (Exception ex) {
                        LoggingService.LogWarning("Error reading provisioning profile '{0}': {1}", fileName, ex);
                    }
                }

                index.ProvisioningProfiles.Sort(CreationDateComparer);
            }
            else
            {
                Directory.CreateDirectory(profilesDir);
            }

            index.Version      = IndexVersion;
            index.LastModified = Directory.GetLastWriteTimeUtc(profilesDir);

            index.Save(indexName);

            return(index);
        }
        public static MobileProvisionIndex Load(string fileName)
        {
            var previousCreationDate = DateTime.MaxValue;
            var index  = new MobileProvisionIndex();
            var sorted = true;

            using (var stream = File.OpenRead(fileName)) {
                using (var reader = new BinaryReader(stream)) {
                    index.Version      = reader.ReadInt32();
                    index.LastModified = new DateTime(reader.ReadInt64(), DateTimeKind.Utc);

                    int count = reader.ReadInt32();
                    for (int i = 0; i < count; i++)
                    {
                        var profile = ProvisioningProfile.Load(reader);
                        index.ProvisioningProfiles.Add(profile);

                        if (profile.CreationDate > previousCreationDate)
                        {
                            sorted = false;
                        }

                        previousCreationDate = profile.CreationDate;
                    }

                    if (!sorted)
                    {
                        index.ProvisioningProfiles.Sort(CreationDateComparer);
                    }

                    return(index);
                }
            }
        }