Member 14143173 Ответов: 2

Как написать файл с использованием физического пути


я хочу написать исключение в текстовом файле, который принимает виртуальный путь, его запись файла только в виртуальном пути.но я хочу написать этот файл в физическом пути

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

string dir = "D:\\Oracle Logs\\Error.txt";  // folder location
               if (!Directory.Exists(dir))
               {
                   Directory.CreateDirectory(dir);
                   File.AppendAllText(Server.MapPath("D:\\Oracle Logs\\Error.txt"), "Message :" + ex.Message + "<br/>" + Environment.NewLine + "StackTrace :" + ex.StackTrace +
              "" + Environment.NewLine + "Date :" + DateTime.Now.ToString() + "WarningException:" + ex.InnerException);
                   string New = Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine;
                   File.AppendAllText(Server.MapPath("D:\\Oracle Logs\\Error.txt"), New);
                   // ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alert", "alert(objex.Message);", true);

               }

               string filePath = Server.MapPath("D:\\Oracle Logs\\Error.txt");

               using (StreamWriter writer = new StreamWriter(filePath, true))
               {
                   writer.WriteLine("-----------------------------------------------------------------------------");
                   writer.WriteLine("Date : " + DateTime.Now.ToString());
                   writer.WriteLine();

                   while (ex != null)
                   {
                       writer.WriteLine(ex.GetType().FullName);
                       writer.WriteLine("Message : " + ex.Message);
                       writer.WriteLine("StackTrace : " + ex.StackTrace);

                       ex = ex.InnerException;
                   }
               }

Richard MacCutchan

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

2 Ответов

Рейтинг:
2

lmoelleb

У вас есть путь, жестко закодированный несколько раз, даже если он находится в переменной под названием "dir" в первой строке. Имя переменной и комментарий указывают, что это каталог, но он включает в себя имя файла. Затем вы просите создать каталог с именем файла.

Очистите его, а затем запустите через отладчик, чтобы увидеть, какой путь используется, как и ожидалось, и, что более важно, в какой строке вы получите неправильное значение. И ознакомьтесь с документацией: HttpServerUtility.Метод MapPath(String) (System.Web) | Microsoft Docs[^] - Почему вы вызываете MapPath, когда у вас уже есть полный путь к файловой системе, жестко закодированный?

Если вы считаете, что использование отладчика-это продвинутая тема, которую вы узнаете позже, то сразу же измените свои приоритеты. Изучение основ работы отладчика занимает 10 минут, и это время окупается в течение одного дня.


Рейтинг:
1

OriginalGriff

Вы не можете, кроме как с помощью сервера.MapPath как у вас. Как веб-сайт, вам обычно не предоставляется никакого доступа к "остальной части машины", чтобы вы случайно не испортили другие сайты.
Сервер.MapPath преобразует путь, ориентированный на сайт, например "~/documents/myDoc.docx" к физическому пути на сервере: "C:\sites\iis\Yourdomain\main\documents\myDoc.Docx", он не будет "переводить" физическую адресную строку "D:\Oracle Logs\Error.txt-и дать вам доступ к файлу.

Кроме того, вы должны знать, что сервер баз данных может даже не находиться на одной машине - он редко находится в рабочем состоянии, - поэтому нужная вам папка, скорее всего, находится в другом месте сети и, вероятно, не является общей.

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

И сделайте себе одолжение; не жестко кодируйте пути: всегда храните их в конфигурационных файлах, чтобы код не нужно было менять, когда они это сделают.