Если Вы управляете процессом проверки, или он имеет предсказуемый вывод, вышеупомянутые решения (хранящий в tempfile, пока не закончено, то mv'ing к месту завершенных загрузок, или игнорирующий файлы с '.downloading' вид имени) могли бы работать. Если все это находится вне Вашего контроля, можно удостовериться, что файл не открыт никаким процессом путем выполнения 'lsof $filename' и проверки, существует ли результат. Очевидно, если ни у кого нет открытого файла, безопасно переместить его.
Вы можете изменить параметр фиксированного размера на параметр массива, чтобы вы могли поместить расширение в любой массив. Затем я использовал рекурсию для перебора каждой позиции массива.
public static void Fill<T>(this Array source, T value)
{
Fill(0, source, new long[source.Rank], value);
}
static void Fill<T>(int dimension, Array array, long[] indexes, T value)
{
var lowerBound = array.GetLowerBound(dimension);
var upperBound = array.GetUpperBound(dimension);
for (int i = lowerBound; i <= upperBound; i++)
{
indexes[dimension] = i;
if (dimension < array.Rank - 1)
{
Fill(dimension + 1, array, indexes, value);
}
else
{
array.SetValue(value, indexes);
}
}
}
Вот решение, которое не использует рекурсию (и является менее сложным):
public static void FillFlex<T>(this Array source, T value)
{
bool complete = false;
int[] indices = new int[source.Rank];
int index = source.GetLowerBound(0);
int totalElements = 1;
for (int i = 0; i < source.Rank; i++)
{
indices[i] = source.GetLowerBound(i);
totalElements *= source.GetLength(i);
}
indices[indices.Length - 1]--;
complete = totalElements == 0;
while (!complete)
{
index++;
int rank = source.Rank;
indices[rank - 1]++;
for (int i = rank - 1; i >= 0; i--)
{
if (indices[i] > source.GetUpperBound(i))
{
if (i == 0)
{
complete = true;
return;
}
for (int j = i; j < rank; j++)
{
indices[j] = source.GetLowerBound(j);
}
indices[i - 1]++;
}
}
source.SetValue(value, indices);
}
}
Это смоделировано на основе System.Array.ArrayEnumerator. Эта реализация должна иметь такой же уровень правильности, что и ArrayEnumerator, и (на основании нескольких выборочных проверок), похоже, работает нормально.