Johny Flow Ответов: 1

Как правильно сохранять и открывать файлы ( не разрушая файл )


привет, это мой код :
private void BtnDisplay_Click(object sender, EventArgs e)
        {
            if (GridFile.CurrentCell == null)
            {
                MessageBox.Show("select a row");
                return;
            }
            DataTable dt = new DataTable();
            int SelectedRow = GridFile.CurrentCell.RowIndex;
            string OriginalPath = GridFile.SelectedRows[0].Cells[2].Value.ToString();
            string tempsafefilename = GridFile.SelectedRows[0].Cells[5].Value.ToString();
            saveFileDialog1.FileName = OriginalPath;
            string FileName = saveFileDialog1.FileName;
            //.......
            if (File.Exists(FileName))
            {
                Process.Start(FileName);
            }
            else
            {
 
byte[] FileData = new byte[32768];
               FileData = (byte[])DS.Tables["TeacherFile"].Rows[SelectedRow]["FileData"];
                String newfile = @"D:\Temp";
                DirectoryInfo l_dDirInfo = new DirectoryInfo(newfile);
                if (l_dDirInfo.Exists == false)
                {
                    Directory.CreateDirectory(newfile);
                }
 
                string NewPath = newfile + "\\" + tempsafefilename;
 

                    //FileStream fStream = new FileStream(NewPath, FileMode.Create);
 
                    //while (fStream.Read(FileData, 0, FileData.Length) > 0)
                    //{
                    //    Process.Start(NewPath);
                    //}
                   
                    using (FileStream fStream = new FileStream(NewPath, FileMode.Create))
                    {
                        fStream.Write(FileData, 0, FileData.Length);
                        FileData = ReadToEnd(fStream);
                        fStream.Write(FileData, 0, FileData.Length);
                        Process.Start(NewPath);
                    }
 
 public static byte[] ReadToEnd(System.IO.Stream stream)
        {
            long originalPosition = 0;
 
            if (stream.CanSeek)
            {
                originalPosition = stream.Position;
                stream.Position = 0;
            }
 
            try
            {
                byte[] readBuffer = new byte[4096];
 
                int totalBytesRead = 0;
                int bytesRead;
 
                while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0)
                {
                    totalBytesRead += bytesRead;
 
                    if (totalBytesRead == readBuffer.Length)
                    {
                        int nextByte = stream.ReadByte();
                        if (nextByte != -1)
                        {
                            byte[] temp = new byte[readBuffer.Length * 2];
                            Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length);
                            Buffer.SetByte(temp, totalBytesRead, (byte)nextByte);
                            readBuffer = temp;
                            totalBytesRead++;
                        }
                    }
                }
 

                byte[] buffer = readBuffer;
                if (readBuffer.Length != totalBytesRead)
                {
                    buffer = new byte[totalBytesRead];
                    Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead);
                }
                return buffer;
            }
            finally
            {
                if (stream.CanSeek)
                {
                    stream.Position = originalPosition;
                }
            }
        }
        //....OKKKKKK
        byte[] ReadFile(string sPath)
        {
 

            FileStream fStream = new FileStream(sPath, FileMode.Open, FileAccess.Read);
            byte[] buffer = new byte[32768];
            int read = 0;
            int chunk;
            fStream.Position = 3147483648;
            while ((chunk = fStream.Read(buffer, read, buffer.Length - read)) > 0)
            {
                read += chunk;
 
                // If we've reached the end of our buffer, check to see if there's
                // any more information
                if (read == buffer.Length)
                {
                    int nextByte = fStream.ReadByte();
 
                    // End of stream? If so, we're done
                    if (nextByte == -1)
                    {
                        return buffer;
                    }
 
                    // Nope. Resize the buffer, put in the byte we've just
                    // read, and continue
                    byte[] newBuffer = new byte[buffer.Length * 2];
                    Array.Copy(buffer, newBuffer, buffer.Length);
                    newBuffer[read] = (byte)nextByte;
                    buffer = newBuffer;
                    read++;
                }
            }
            // Buffer is now too big. Shrink it.
            byte[] ret = new byte[read];
            Array.Copy(buffer, ret, read);
            return ret;
        }

моя программа преобразует файл (любой файл - фильм - музыка - zip...) в коды (0 и 1-я думаю) и сохраняет его в моей базе данных SQL. теперь, когда я нажимаю на кнопку (Открыть файл-показать), он показывает мне файл, но файл уничтожен. ссылка ниже - это картинка "veronica movie" (это около 700 МБ), я сохраняю ее с помощью своего программного обеспечения, и когда я нажал на кнопку открыть, мое программное обеспечение открыло файл, но он был поврежден, и KMPlayer показал мне эти коды. как это исправить? пожалуйста, помогите мне.

https://i.imgsafe.org/f52cc7409c.png[^]

Что я уже пробовал:

я положил сюда свои старые коды :

http://snipsave.com/user/profile/johnnyflow#14098

1 Ответов

Рейтинг:
5

OriginalGriff

Скорее всего, вы не сохраняете нужные данные в БД или не извлекаете их и не сохраняете снова должным образом.
Самый простой способ сохранить файл в SQL - это загрузить его непосредственно в байтовый массив и сохранить его:

byte[] data = File.readAllBytes(pathToFile);

И записать байты обратно в файл тоже тривиально:
File.WriteAllBytes(pathToFile, data);

Здесь есть информация о том, как сохранить и извлечь его в БД: Почему я получаю " параметр недопустим." исключение, когда я читаю изображение из своей базы данных?[^]- он основан на изображениях, но принципы точно такие же для видеоданных.

Но...Я бы не стал хранить видеоданные в базе данных: это большие данные, и это вызовет множество узких мест в вашей системе, чтобы сохранить и извлечь их.
Вместо этого сохраните видео в виде файла и сохраните расположение файла в БД.
Я бы сделал это так: скопировал файл в "известное" место с именем Guid с помощью File.Скопируйте и затем сохраните путь на основе Guid плюс исходное имя файла в БД.
Затем вы можете воссоздать оригинал с помощью файла.Скопируйте, чтобы положить его обратно, когда это будет необходимо.


Johny Flow

поблагодарить у очень многое. не могли бы вы точно сказать мне, где я должен написать эти 2 строки кодов ?!! (Я очень новичок в программировании, и английский - мой второй язык-я создаю эту программу за 1 месяц, и она все еще не работает. это просто так тяжело). и у меня есть еще один вопрос: я хочу загрузить этот файл, даже если он удален или перемещен ( я имею в виду, что я помещаю файл на свой рабочий стол и конвертирую его в код с помощью своей программы, сохраняю его и удаляю этот файл с моего рабочего стола. теперь я хочу, чтобы моя программа открыла этот файл из базы данных

OriginalGriff

Как я уже сказал, Я бы вообще не стал хранить его в БД - это действительно не очень хорошая идея!
Но ... первая строка считывает файл в память. Поэтому, когда вы хотите прочитать файл... :смеяться:
Затем вы можете использовать код в ссылке, чтобы сохранить его в БД.
Второй - записать его в файл - так вы используете его после кода в ссылке!

Что касается вашего второго вопроса: сначала заставьте его работать в БД и из нее, а потом беспокойтесь о чем - нибудь другом. Но если вы используете это, чтобы "скрыть" свою коллекцию видео по какой-то причине, то имейте в виду, что он не будет скрывать ее больше чем на несколько секунд от любого наполовину компетентного человека!

Johny Flow

я знаю, что не должен хранить огромные файлы в БД, но я что-то тестирую ... нет, я не хочу скрывать фильмы или что-то еще, я просто хочу создавать резервные копии файлов ( чтобы, когда я случайно удалю файл, я мог восстановить его снова ). спасибо.

OriginalGriff

Не пиши своих-это не лучший способ, поверь мне! Вместо этого посмотрите на что-то вроде этого:

http://www.aomeitech.com/aomei-backupper.html

Я использую его: бесплатная версия превосходна, так хороша, что я заплатил свои собственные деньги за полную!
И вы действительно, действительно не хотите делать резервные копии на один и тот же диск: это просто означает, что когда вы получаете проблему с диском, вы также теряете резервную копию! А резервное копирование в SQL DB через сеть будет болезненным, через интернет-ужасно медленным. Для резервного копирования используйте съемный USB-накопитель и отключите его, когда закончите (чтобы вымогатели также не могли повредить ваши резервные копии).

Johny Flow

Хорошо, я использую AOMEI backupper. я знаю, что у меня есть 2 внешних жестких диска ( 1. 500gb - 2. 2TB), и я делаю резервную копию всех своих файлов на жесткий диск (2TB) примерно каждую неделю, потому что мой жесткий диск ноутбука был стерт раньше, и я потерял около 600 Гб информации, и я хотел пробить ноутбук, но вы знаете, что это дорого :D ! ( поэтому я купил внешний жесткий диск 2tb и...). последний вопрос ( я обещаю:) был ли мой английский хорош?!. спасибо человеку за все.

OriginalGriff

Делайте резервную копию образа еженедельно, но чередуйте два внешних диска - таким образом вы минимизируете потери, если получаете случайное оборудование. И всегда отключайте диск, когда резервное копирование завершено!
Резервная копия AOMEI позволяет восстановить весь образ и вернуть всю систему обратно, или загрузить туда образ в виде виртуального диска и получить доступ к отдельным файлам, что очень удобно!

OriginalGriff

У тебя прекрасный английский!