GetFiles () возвращает новый массив. Неважно, что вы объявили f как массив размера 300 как раз перед тем, как GetFiles возвращает его, переназначает f с новым массивом, а старый размер 300 теряется.
FileInfo[] f = new FileInfo[300]; //<-- Creates a array of size 300.
f = d2[z].GetFiles(); //<-- replaces f with a new array. This array will contain just enough space for the number of files found.
Вам вообще не нужно создавать массив, вы можете просто сделать это.
FileIndo[] f = d2[z].GetFiles();
Когда вам нужен доступ к нему, вы должны сначала проверить длину массивов или использовать цикл for / foreach для итерации по каждому элементу в массиве.