Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: узнать открыт файл или нет Добавлено: 09.03.07 18:51  

Автор вопроса:  Георгич
Как программно узнать открыт файл или нет?

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 Viper



ICQ: 249094859 

Вопросов: 0
Ответов: 310
 Профиль | | #1 Добавлено: 10.03.07 08:27
Чей файл, для чего узнать, короче критериев много. Описывай конкретную ситуацию, а то решений тут великое множество от просто попробовать открыть до похода в ядро для получения инфы о хэндлах.

Ответить

Номер ответа: 2
Автор ответа:
 Георгич



Вопросов: 16
Ответов: 52
 Профиль | | #2 Добавлено: 10.03.07 18:02
Первоначально, была проблема с шифрованием , ключ шифрования создан на основе пароля, когда вводишь правильный пароль проблем нет , а когда неверный выбрасывается исключение, после которого, если вводить опять пароль(правильный или не правильный), то выбрасывается опять исключение которое говорит о том , что файл для дешифровки открыт и соответственно доступа к нему нет. Я и хотел вставить в обработчик ошибок , фразу типа « Если файл С:\Тест.txt открыт , закрой его» Но вспомнил, что есть оператор Finally и файл закрываю там. Всё проблем нет с неверным паролем. Но вопрос остался. Как, например в своей проге написать « Если файл С:\Тест.txt открыт, закрой его» или « Если файл С:\Тест.txt открыт, верни True»

Ответить

Номер ответа: 3
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #3 Добавлено: 10.03.07 18:13
Очень похоже на неверное проектирвание.
Файл открывается в пределах программы? Зачем же держать его все время открытым?

Вобщем ничего разумного я не понял.

Ответить

Номер ответа: 4
Автор ответа:
 Георгич



Вопросов: 16
Ответов: 52
 Профиль | | #4 Добавлено: 10.03.07 22:49
Может я запутанно как-то написал, откинем всё про шифрование и предположим такую ситуацию, я в ручную открыл файл С:\Тест.txt свернул окно и забыл про него, потом в своей проге обращаюсь к этому же (открытому) файлу, чтоб не выскочило исключение как программно мне его закрыть, так сказать на опережение ?

Ответить

Номер ответа: 5
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #5
Добавлено: 11.03.07 21:22
заведомо неверный подход, мне кажется. Если файл и необходимо держать открытым (ну типа чтоб в него никто гряными лапами не лазил или не удалил), то весь доступ внутри программы к этому файлу должен обеспечиваться посредством класса, который будет открывать файл, если он закрыт и просто работать с ним, если он уже открыт.
А вообще конечно, если позволяет логика программы, не держать файл открытым. Чтобы обезопасить себя от всех случайных "незакрытий" внутри процедур, открывай файл используя using'и (ты ведь с файловыми потоками работаешь?) тогда вне зависимости от того вылетело ли исключение или нет, при выходе из блока using экземпляр будет разрушен и файл закроется.

Ответить

Номер ответа: 6
Автор ответа:
 Георгич



Вопросов: 16
Ответов: 52
 Профиль | | #6 Добавлено: 12.03.07 08:59
Да с потоками я, работая, а вот что такое блок using не знаю, если можно пару строк кода для примера ,чтобы понять про что речь

Ответить

Номер ответа: 7
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #7
Добавлено: 12.03.07 10:14
Вот простынка из того, что сейчас лабаю.


        private void Head_Load(object sender, EventArgs e)
        {
            try
            {
                using (OracleConnection conn = new OracleConnection(GetConnectionString))
                {
                    conn.Open();
                    using (OracleTransaction tran = conn.BeginTransaction())
                    {
                        string insert_row_text = "BEGIN TECH.PSERVICE_CENTER.INSERT_ROW (IN_SERVICE_CENTER_TYPE_ID => :IN_SERVICE_CENTER_TYPE_ID,IN_NODE_ID => :IN_NODE_ID,IN_NAME => :IN_NAME,IN_NOTE => :IN_NOTE,IN_VISIBLE => :IN_VISIBLE,IN_ID => :IN_ID,OUT_ID => :OUT_ID); END;";
                        using (OracleCommand cmd_ins = new OracleCommand(insert_row_text, tran.Connection))
                        {
                            OracleParameter prmInsServCenterId = cmd_ins.Parameters.Add("IN_SERVICE_CENTER_TYPE_ID", OracleType.Number);
                            OracleParameter prmInsNodeId = cmd_ins.Parameters.Add("IN_NODE_ID", OracleType.Number);
                            OracleParameter prmInsName = cmd_ins.Parameters.Add("IN_NAME", OracleType.VarChar);
                            OracleParameter prmInsNote = cmd_ins.Parameters.Add("IN_NOTE", OracleType.VarChar);
                            OracleParameter prmInsVisible = cmd_ins.Parameters.Add("IN_VISIBLE", OracleType.Number);
                            OracleParameter prmInsInId = cmd_ins.Parameters.Add("IN_ID", OracleType.Number);
                            OracleParameter prmInsOutId = cmd_ins.Parameters.Add("OUT_ID", OracleType.Number);
                            prmInsOutId.Direction = ParameterDirection.Output;

                            cmd_ins.Transaction = tran;
                            try
                            {
                                using (OracleCommand cmd_check = new OracleCommand("select count(*) from tech.service_center where service_center_type_id=4 and node_id=:NODE_ID", tran.Connection))
                                {
                                    cmd_check.Transaction = tran;
                                    OracleParameter prmChkNodeId = cmd_check.Parameters.Add("NODE_ID", OracleType.Number);
                                    using (DataTable tbl = new DataTable())
                                    {
                                        using (OracleDataAdapter adap = new OracleDataAdapter("", tran.Connection))
                                        {
                                            adap.SelectCommand.Transaction = tran;
                                            adap.SelectCommand.CommandText = "select sc.id sc_id,sc.node_id,t.name town_name " +
                                                                             "from tech.service_center sc,tech.node n,db.town t " +
                                                                             "where   sc.node_id=n.id and n.town_id=t.id " +
                                                                                 "and sc.service_center_type_id=4 " +
                                                                                 "and sc.id<=2206 " +
                                                                             "order by sc.id, sc.node_id";
                                            adap.Fill(tbl);
                                        }

                                        foreach (DataRow row in tbl.Rows)
                                        {
                                            prmChkNodeId.Value = row["node_id"];
                                            if (Convert.ToInt32(cmd_check.ExecuteScalar()) == 1)
                                            {
                                                System.Diagnostics.Debug.WriteLine("Будем работать с " + row["town_name"].ToString());
                                                prmInsServCenterId.Value = 4;
                                                prmInsNodeId.Value = row["node_id"];
                                                prmInsNote.Value = "";
                                                prmInsVisible.Value = 1;

                                                prmInsName.Value = "New рабочее место";
                                                prmInsInId.Value = DBNull.Value;
                                                prmInsOutId.Value = DBNull.Value;
                                                cmd_ins.ExecuteNonQuery();
                                                //prmInsName.Value =
                                            }
                                        }
                                    }
                                }
                                //tran.Commit();
                            }
                            catch (Exception ex)
                            {
                                tran.Rollback();
                                throw ex;
                            }

                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

Благодаря юсингам можно не беспокоится, что коннект останется открытым, всё замечательно уничтожается вне зависимости от поведения кода. И все прочие ресурсы (таблицы, адаптеры, команды) уничтожаются самым естественным образом - внутри тех процедур, где они были созданы.
Я совсем недавно начал ими пользоваться (кстати, тоже здесь подсказали), а до этого пытался лепить Dispose в Finally, но не работало не фига (когда эксепшн выталкиваешь finally не срабатывает), поэтому на данный момент у меня юсинги рулят.

Ответить

Номер ответа: 8
Автор ответа:
 Георгич



Вопросов: 16
Ответов: 52
 Профиль | | #8 Добавлено: 12.03.07 17:37
Спасибо за пример, но он мне не помог т.к я пишу на VB.Net , а вот «С» мне не знаком , судя по описанию using весьма полезен, раз даёт такую возможность на уничтожение, интересно в Net как это сделать?

Ответить

Номер ответа: 9
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #9
Добавлено: 12.03.07 18:45
Это C# - тоже дотнет. И синтаксис на VB у этого оператора абсолютно такой же.

using f_strm as new filestream(file_name,filemode.open,fileacess.read)
f_strm.open()
end using

Ответить

Номер ответа: 10
Автор ответа:
 Георгич



Вопросов: 16
Ответов: 52
 Профиль | | #10 Добавлено: 12.03.07 22:04
Понял, но наверно и это мне не поможет, хотя точно не знаю, я пересмотрел свою литературу ни слова о юсингах и по справке даёт 500 ссылок, но всё не то, скорей всего в VB.Net 2003 , а я всё ещё пишу в нём, этого нет. Если VB.Net 2003 using есть, подскажи где, мне прочитать в справочнике. Заранее спасибо.

Ответить

Номер ответа: 11
Автор ответа:
 Viper



ICQ: 249094859 

Вопросов: 0
Ответов: 310
 Профиль | | #11 Добавлено: 13.03.07 10:10
в 2003 этого нет

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам