не удалось сохранить данные текстового файла в c # - PullRequest
1 голос
/ 19 ноября 2010

кажется, что это редкая проблема, когда я не могу сохранить данные текстового файла strpath = "C: \ путь \ 1234 \ abcd.txt";

здесь файл создается, но данные в нем не сохраняются.

если я проверю байт b длина показывает 121.

public int SaveFile(byte[] b,string lstrpath)
        {
FileStream fs = new FileStream(strpath,FileMode.Create);
                fs.Write(b,0,b.Length);
                fs.Close();
                if(File.Exists(strpath))
                {
                    return 1;
                }
                else
                {
                    return 0;
                }
}

Есть что-нибудь, что я здесь не так?

Ответы [ 4 ]

1 голос
/ 19 ноября 2010

Вы не утилизируете и не очищаете поток.Из-за этого, если произойдет исключение, ваша программа будет пропускать дескриптор файла.Попробуйте вместо этого:

public void SaveFile(byte[] b,string lstrpath)
{
    File.WriteAllBytes(lstrpath, b);
}

, которая теперь отчасти побеждает цель метода SaveFile, поскольку он уже встроен в BCL.

0 голосов
/ 19 ноября 2010

Все остальные ответы верны (обработка исключений, удаление, ...), вы можете даже использовать оператор using. Я бы пошел с ответом Дарина Димитрова, который делает ваш код намного проще и легче для чтения.

Что касается вашего вопроса: как вы вызываете этот метод? Это работает для меня в простом консольном приложении:

class Program
{
    static void Main(string[] args)
    {
        var text = "abcd";
        var encoding = new UTF8Encoding();
        var bytes = encoding.GetBytes(text);
        SaveFile(bytes, @"D:\test.txt");
    }

    public static int SaveFile(byte[] b, string strpath)
    {
        FileStream fs = new FileStream(strpath, FileMode.Create);
        fs.Write(b, 0, b.Length);
        fs.Close();
        if (File.Exists(strpath))
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }
}

Обратите внимание, я использую точно такой же метод. Он работает для меня каждый раз, поэтому файл уже может существовать. В вашем случае, вы не можете передать строку? Может быть проблема с кодировкой?

0 голосов
/ 19 ноября 2010

Может быть несколько вещей, конечно? Вы не проверяете, существует ли файл уже. Вы не проверяете, существует ли каталог. Вы не проверяете разрешения вашей файловой системы. Любой из них может привести к сбою.

Кроме того, когда вы говорите «провал», что вы имеете в виду? Вы получаете исключение? Ошибка? Возвращает 0 или 1? Это молча терпит неудачу? Файл создается пустым?

Здесь вам также потребуется некоторая обработка ошибок, которая будет иметь двойное преимущество, сообщая вам, где произошла ошибка, и, надеюсь, немного больше информации о ней.

0 голосов
/ 19 ноября 2010

Сделайте Flush () перед закрытием. Это fs.Flush ();

...