автоматическое увеличение имени файла - PullRequest
0 голосов
/ 13 января 2009

У меня есть имя файла в следующем формате:

метки имя пользователь-1

Этот файл постоянно записывается, но прежде чем он станет слишком большим, я хочу создать новый файл.

метки имя пользователь-2

Как я могу добиться этого, используя наименьшее количество памяти (т.е. без или с небольшими переменными)

вот моя версия:

        private void Split() {
            char[] strArr = FlowArgs.Filename.ToCharArray();
            int num;
            //get the last number
            if(Int32.TryParse(strArr[strArr.Length - 1].ToString(), out num)) {
                num += 1;
            }
            //replace the old number with the new number
            char.TryParse(num.ToString(), out strArr[strArr.Length - 1]);
            FlowArgs.Filename = strArr.ToString();

        }

Edit: Я добавил свойство «версия» (int) в классе FlowArgs. Однако моя новая проблема заключается в том, как я могу добавить это в конце имени файла

Ответы [ 4 ]

5 голосов
/ 13 января 2009

Я думаю, вы должны просто хранить счетчик в int. Я понимаю, что вы хотите сэкономить место в памяти, но, если честно, дополнительный int действительно находится в категории "приемлемых". Я имею в виду, что анализатор Int32, вероятно, тратит гораздо больше памяти. Не забывайте, что на x86 пространство памяти разделено до 4096 байтовых страниц, поэтому память тратится намного больше, чем эти 4 байта.

РЕДАКТИРОВАТЬ : Вероятно, вы хотите иметь метод, подобный GetNextFileName (), в вашем классе, который генерирует вам следующее имя файла (возможность реорганизовать ваш код в маленькие биты важна, гораздо важнее, чем экономия памяти пробел):

private int nextFileNumber = 0;

private string GetNextFileName(string userName)
{
    return String.Format("{0}-{1}-{2}", DateTime.Now, userName,
       nextFileNumber++);
}
2 голосов
/ 13 января 2009

«наименьший объем памяти» НЕ равен «нет или мало переменных»

Локальные переменные занимают мало памяти. Но создание объектов в куче занимает гораздо больше времени, и для их очистки требуется GC.

В вашем примере ваши ToCharArray () и ToString () создали 4 объекта (косвенный созданный объект не включен).

1 голос
/ 13 января 2009

Вместо использования счетчика хода, рассмотрите возможность использования datetime of creation в качестве изменяющейся части вашего имени файла. Таким образом, вам не нужно сохранять и извлекать предыдущее значение. Используя метод ToBinary(), вы можете получить числовое представление времени. Конечно, можно использовать любой формат времени , допустимый в имени файла - см. пользовательские строки формата даты и времени .

1 голос
/ 13 января 2009

ваша строковая переменная уже является символьным массивом:

    int num=0;
    //get the last number
    if (Int32.TryParse(FolwArgs.Filename[FolwArgs.Filename.Length-1].ToString(), out num))
        num++;
    //replace the old number with the new number
    char.TryParse(num.ToString(), out FolwArgs.Filename[FolwArgs.Filename.Length-1]]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...