Существует только обходной путь для проблемы, с которой вы сталкиваетесь.
Перед запуском процесса копирования проверьте, не запущен ли файл. Вы можете вызвать следующую функцию, пока не получите значение False.
1st Method, скопированный непосредственно из этого ответа :
private bool IsFileLocked(FileInfo file)
{
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
//the file is unavailable because it is:
//still being written to
//or being processed by another thread
//or does not exist (has already been processed)
return true;
}
finally
{
if (stream != null)
stream.Close();
}
//file is not locked
return false;
}
2nd Method:
const int ERROR_SHARING_VIOLATION = 32;
const int ERROR_LOCK_VIOLATION = 33;
private bool IsFileLocked(string file)
{
//check that problem is not in destination file
if (File.Exists(file) == true)
{
FileStream stream = null;
try
{
stream = File.Open(file, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (Exception ex2)
{
//_log.WriteLog(ex2, "Error in checking whether file is locked " + file);
int errorCode = Marshal.GetHRForException(ex2) & ((1 << 16) - 1);
if ((ex2 is IOException) && (errorCode == ERROR_SHARING_VIOLATION || errorCode == ERROR_LOCK_VIOLATION))
{
return true;
}
}
finally
{
if (stream != null)
stream.Close();
}
}
return false;
}
По сути, вы хотите сгенерировать декартово произведение, а затем объединить элементы каждого 2-кортежа. Это проще всего сделать в синтаксисе запроса:
var cartesianConcat = from a in seq1
from b in seq2
select a + b;
Используйте SelectMany, когда вы хотите сформировать декартово произведение двух списков:
aList.SelectMany(a => bList.Select(b => a + b))
1111 Просто чтобы прояснить: оба подхода будут работать. Я просто предпочитаю это:)
Относительно того, понятнее ли это, чем синтаксис выражения запроса ... Я не уверен. Я обычно использую вызовы методов, когда это просто случай использования одного оператора, но для Join
, GroupJoin
, SelectMany
и GroupBy
выражения запросов действительно упрощают вещи. Попробуйте оба варианта и посмотрите, какие вы найдете более читабельными:)