Вот один из способов: сохранить отдельный файл, чтобы отслеживать базы данных, которые вы уже восстановили. Затем просто выберите первую базу данных из главного списка, который не имеет записи в файле «RestoredDatabases.txt».
UPDATE
Я создал класс для хранения информации базы данных из текстового файла, и метод, который можно назвать, который будет заполнять список этого класса из вашей файловой структуры.
Во-первых, вот класс для представления базы данных, которая может быть прочитана или записана в файл. Примечание: Я перепробовал метод ToString()
, поэтому он пишет текст в той же файловой структуре, о которой вы упомянули, и я внедрил Equals
, чтобы упростить сравнение между списками этого объекта.
private class LogFileDatabase
{
public const string NamePrefix = "dbName:";
public const string ServerPrefix = "ServerToRestoreTo:";
public string DbName { get; set; }
public string Server { get; set; }
public override string ToString()
{
return string.Format("{0}\"{1}\"{2}{3}\"{4}\"",
NamePrefix, DbName, Environment.NewLine, ServerPrefix, Server);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((LogFileDatabase) obj);
}
private bool Equals(LogFileDatabase other)
{
return (string.Equals(DbName, other.DbName) &&
string.Equals(Server, other.Server));
}
public override int GetHashCode()
{
unchecked
{
return ((DbName != null ? DbName.GetHashCode() : 0) * 397)^
(Server != null ? Server.GetHashCode() : 0);
}
}
}
Далее я написал метод, который будет читать текстовый файл, разобрать его для имен баз данных и серверов, и возвращает список выше LogFileDatabase
объектов:
private static IEnumerable<LogFileDatabase> GetDatabasesFromLog(string logPath)
{
if (logPath == null) throw new ArgumentNullException("logPath");
if (!File.Exists(logPath))
{
throw new FileNotFoundException(
string.Format("logPath does not exist: {0}", logPath));
}
var databasesFromLog = new List<LogFileDatabase>();
var fileLines = File.ReadAllLines(logPath)
.Where(line => !string.IsNullOrWhiteSpace(line));
var logFileDb = new LogFileDatabase();
foreach (var fileLine in fileLines)
{
var dbNameIndex = fileLine.IndexOf(LogFileDatabase.NamePrefix);
if (dbNameIndex > -1)
{
logFileDb.DbName = fileLine.Substring(
dbNameIndex + LogFileDatabase.NamePrefix.Length).Replace("\"", "");
continue;
}
var serverIndex = fileLine.IndexOf(LogFileDatabase.ServerPrefix);
if (serverIndex == -1) continue;
logFileDb.Server = fileLine.Substring(
serverIndex + LogFileDatabase.ServerPrefix.Length).Replace("\"", "");
databasesFromLog.Add(logFileDb);
logFileDb = new LogFileDatabase();
}
return databasesFromLog;
}
Наконец, вот пример использования класса и метода для чтения файла базы данных и восстановления первой базы данных, которая не существует в восстановленном файле базы данных, а затем записывает имя восстановленной базы данных в новый файл:
public static void Main()
{
// The file containing all databases to restore
string databasesToRestore = "c:\\program\\settings\\DatabasesToRestore.txt";
// A file that will contain the names of databases that have already been restored
string restoredDatabases = "c:\\program\\workingDir\\RestoredDatabases.txt";
if (File.Exists(databasesToRestore))
{
// Ensure restored databases file exists
if (!File.Exists(restoredDatabases))
{ using (var tmp = File.Create(restoredDatabases)) { } }
LogFileDatabase databaseToRestore =
GetDatabasesFromLog(databasesToRestore)
.Except(GetDatabasesFromLog(restoredDatabases))
.FirstOrDefault();
if (databaseToRestore != null)
{
// Call retore database code here, restoring `databaseToRestore`
RestoreDbToServer(databaseToRestore.DbName, databaseToRestore.Server);
// Write the name of the database we just restored
// to our 'restoredDatabases` file
File.AppendAllLines(restoredDatabases,
new List<string> {databaseToRestore.ToString()});
}
else
{
// There are no databases left to restore,
// so we can delete our `restoredDatabases` file now.
// But be careful - this means when you run the program again,
// it will start restoring the first database.
File.Delete(restoredDatabases);
}
}
}
Я добавил очень длинный ответ, но, надеюсь, это поможет здесь ... –