как передавать путь к файлу?
Если программа лежит в папке «D:Proga\Bin», то надо выйти на уровень вверх:
std::string path("..\\File\\file.txt");
(Двойная косая черта нужна, так как в Си одинарная такая черта обозначает управляющий символ).
Вариант, как могла бы выглядеть ваша программа:
#include #include #include int main(int argc, char* argv[]) < if (argc >1) < std::string path(argv[1]); std::ofstream fout(path); // Тут работаем с файлом >else < std::cout return 0; >
Как указать путь к файлу в c
У меня было так
#define DATA_FILE _T("C://set.ds")
Я открывал этот файл, при необходимости он создавался — и все было бы хорошо, но
#define DATA_FILE _T("C://Program Files//Internet Explorer//PLUGINS//set.ds")
И все больше файл открываться не хочет! (и не создается) Я больше ничего не менял в программе — значит виноваты эти строки. Подскажите, плиз.
03.03.06 22:54: Перенесено модератором из ‘C/C++’ — Павел Кузнецов
Re: Как правильно писать путь к файлу?
| От: | LuciferMoscow |
| Дата: | 03.03.06 10:19 |
| Оценка: |
Здравствуйте, AlexDav, Вы писали:
AD>У меня было так
AD>
AD>#define DATA_FILE _T("C://set.ds") AD>
AD>Я открывал этот файл, при необходимости он создавался — и все было бы хорошо, но
AD>Я заменил на
AD>
AD>#define DATA_FILE _T("C://Program Files//Internet Explorer//PLUGINS//set.ds") AD>
AD>И все больше файл открываться не хочет! (и не создается) Я больше ничего не менял в программе — значит виноваты эти строки. Подскажите, плиз.
Попробуй путь взять в кавычки. У тебя есть пробел в пути к файлу
const TCHAR DATA_FILE[]_T("\"C://Program Files//Internet Explorer//PLUGINS//set.ds\"");
Re: Как правильно писать путь к файлу?
| От: | HiSH | http://m0riarty.ya.ru |
| Дата: | 03.03.06 10:21 | |
| Оценка: | 2 (2) | |
Здравствуйте, AlexDav, Вы писали:
AD>
AD>#define DATA_FILE _T("C://set.ds") AD>
AD>Я открывал этот файл, при необходимости он создавался — и все было бы хорошо, но
AD>Я заменил на
AD>
AD>#define DATA_FILE _T("C://Program Files//Internet Explorer//PLUGINS//set.ds") AD>
AD>И все больше файл открываться не хочет! (и не создается) Я больше ничего не менял в программе — значит виноваты эти строки. Подскажите, плиз.
А зачем двойные слеши? Должно быть или «c:\\program files\\. «, или «c:/program files/. «
Re: Как правильно писать путь к файлу?
| От: | rg45 |
| Дата: | 03.03.06 10:24 |
| Оценка: |
Здравствуйте, AlexDav, Вы писали:
AD>У меня было так
AD>
AD>#define DATA_FILE _T("C://set.ds") AD>
AD>Я открывал этот файл, при необходимости он создавался — и все было бы хорошо, но
AD>Я заменил на
AD>
AD>#define DATA_FILE _T("C://Program Files//Internet Explorer//PLUGINS//set.ds") AD>
AD>И все больше файл открываться не хочет! (и не создается) Я больше ничего не менял в программе — значит виноваты эти строки. Подскажите, плиз.
1. Либо «C://set.ds» либо «C:/set.ds» — двойной слэш — это лишний символ в строке, хотя большинством фунций «глотается» нормально.
2. Чтобы ответить, все таки, что не так, нужно видеть, как используется эта строка.
Вполне возможно, что проблема в пробелах, которые присутствуют во втором варианте и которых нет в первом.
—
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: Как правильно писать путь к файлу?
| От: | AlexDav |
| Дата: | 03.03.06 10:27 |
| Оценка: |
Здравствуйте, HiSH, Вы писали:
HSH>А зачем двойные слеши? Должно быть или «c:\\program files\\. «, или «c:/program files/. «
Так вот зачем эти странные палочки?! И точно работает
Re[2]: Как правильно писать путь к файлу?
| От: | rg45 |
| Дата: | 03.03.06 10:27 |
| Оценка: |
R>1. Либо «C://set.ds» либо «C:/set.ds» — двойной слэш — это лишний символ в строке, хотя большинством фунций «глотается» нормально.
Написал не то, что хотел, надо было так:
—
Не можешь достичь желаемого — пожелай достигнутого.
Re: Как правильно писать путь к файлу?
| От: | RevSegment |
| Дата: | 03.03.06 10:34 |
| Оценка: |
Здравствуйте, AlexDav, Вы писали:
AD>У меня было так
AD>
AD>#define DATA_FILE _T("C://set.ds") AD>
AD>Я открывал этот файл, при необходимости он создавался — и все было бы хорошо, но
AD>Я заменил на
AD>
AD>#define DATA_FILE _T("C://Program Files//Internet Explorer//PLUGINS//set.ds") AD>
AD>И все больше файл открываться не хочет! (и не создается) Я больше ничего не менял в программе — значит виноваты эти строки. Подскажите, плиз.
А так не пробовал?
«c:\\Folder One\\Folder Two\\file.ext»
. << RSDN@Home 1.1.4 stable SR1 rev. 568>>
. опыт приходит во время боя .<>
Re[2]: Как правильно писать путь к файлу?
| От: | AlexDav |
| Дата: | 03.03.06 10:46 |
| Оценка: |
Здравствуйте, LuciferMoscow, Вы писали:
LM>Попробуй путь взять в кавычки. У тебя есть пробел в пути к файлу
LM>
LM>const TCHAR DATA_FILE[]_T("\"C://Program Files//Internet Explorer//PLUGINS//set.ds\""); LM>
я попробовал такой путь «C:/Data/set.ds» работает — т.е. ты (можно на ты?) это пробелы, но как ты написал тоже не прокатывает?? Что Делать.
Re[3]: Как правильно писать путь к файлу?
| От: | ekamaloff |
| Дата: | 03.03.06 10:50 |
| Оценка: |
Здравствуйте, AlexDav, Вы писали:
AD>я попробовал такой путь «C:/Data/set.ds» работает — т.е. ты (можно на ты?) это пробелы, но как ты написал тоже не прокатывает?? Что Делать.
Покажи где ты ее используешь и на каком варианте строки ты сейчас остановился.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[4]: Как правильно писать путь к файлу?
| От: | AlexDav |
| Дата: | 03.03.06 11:07 |
| Оценка: |
Здравствуйте, ekamaloff, Вы писали:
E>Покажи где ты ее используешь и на каком варианте строки ты сейчас остановился.
Прошу прощения за MFC
#define DATA_FILE _T("\"C:\\Program Files\\Internet Explorer\\PLUGINS\\set.ds\"") . UINT nFlags = CFile::typeBinary|CFile::modeWrite; if(_waccess(DATA_FILE,0)) // надо его создать? < nFlags |= CFile::modeCreate; bCanSave = TRUE; >else < bCanSave = CanSerialize(); // всегда TRUE :) > if(bCanSave) < CFile file; CFileException fe; if(file.Open(DATA_FILE, nFlags, &fe)) // Вот и не посредственное использование < CArchive ar(&file, CArchive::store); Serialize(ar); ar.Close(); >file.Close(); >
Re[5]: Как правильно писать путь к файлу?
| От: | AlexDav |
| Дата: | 03.03.06 13:35 |
| Оценка: |
Хотите верти — хотите нет, но
#define DATA_FILE _T("C:\\Program Files\\Internet Explorer\\PLUGINS\\set.dln")
просто начала работать и все! Зуб даю кроме этой строчки в программе ничего не менял!
Re[6]: Как правильно писать путь к файлу?
| От: | rg45 | |
| Дата: | 03.03.06 13:39 | |
| Оценка: | 4 (1) | |
Здравствуйте, AlexDav, Вы писали:
AD>Хотите верти — хотите нет, но
AD>
AD>#define DATA_FILE _T("C:\\Program Files\\Internet Explorer\\PLUGINS\\set.dln") AD>
AD>просто начала работать и все! Зуб даю кроме этой строчки в программе ничего не менял!
Впервоначальном варианте у тебя все слэши были двойные. А петерь вместо них одинарные бэк-слэши (литерал «\\» автоматически преобразуется в одинарный бэк-слэш). Значит, какая то из функций не могла вынести присутствия лишних символов в строке.
—
Не можешь достичь желаемого — пожелай достигнутого.
Re[6]: Как правильно писать путь к файлу?
| От: | i-maverick |
| Дата: | 03.03.06 13:48 |
| Оценка: |
Здравствуйте, AlexDav, Вы писали:
AD>Хотите верти — хотите нет, но
AD>
AD>#define DATA_FILE _T("C:\\Program Files\\Internet Explorer\\PLUGINS\\set.dln") AD>
AD>просто начала работать и все! Зуб даю кроме этой строчки в программе ничего не менял!
Тебе ведь так и сказали — нужно либо одинарный прямой слэш, либо двойной обратный.
Ты бы хоть разобрался, зачем тут двойной слэш, чтоб больше не путаться.
Re[7]: Как правильно писать путь к файлу?
| От: | AlexDav |
| Дата: | 03.03.06 13:54 |
| Оценка: |
Здравствуйте, i-maverick, Вы писали:
IM>Тебе ведь так и сказали — нужно либо одинарный прямой слэш, либо двойной обратный.
IM>Ты бы хоть разобрался, зачем тут двойной слэш, чтоб больше не путаться.
Ну ладно ругать то сразу — никто же не сказал что надо весь проект перекомпилить что бы подхватил эту дефайну
Спасибо — за время потраченное на меня
Форматы путей к файлам в системах Windows
Члены большинства типов в пространстве имен System.IO имеют параметр path , который позволяет указать абсолютный или относительный путь к ресурсу в файловой системе. Этот путь передается в API файловой системы Windows. В этом разделе рассматриваются форматы путей к файлам, которые можно использовать в операционных системах Windows.
Традиционные пути DOS
Стандартный путь DOS может состоять из трех компонентов:
- Буква тома или диска, после которой следует разделитель томов ( : ).
- Имя каталога. Символ разделителя каталогов служит для разделения подкаталогов во внутренней иерархии каталога.
- Необязательное имя файла. Символ разделителя каталогов служит для разделения пути к файлу и его имени.
Если присутствуют все три компонента, путь является абсолютным. Если буква тома или диска не указана и имя каталога начинается с символа разделителя каталогов, такой путь задан относительно корня текущего диска. В противном случае путь задан относительно текущего каталога. В следующей таблице показаны некоторые возможные пути к каталогам и файлам.
| Путь | Description |
|---|---|
| C:\Documents\Newsletters\Summer2018.pdf | Абсолютный путь к файлу из корня диска C: . |
| \Program Files\Custom Utilities\StringFinder.exe | Относительный путь от корня текущего диска. |
| 2018\January.xlsx | Относительный путь к файлу в подкаталоге текущего каталога. |
| ..\Publications\TravelBrochure.pdf | Относительный путь к файлу в каталоге, начиная с текущего каталога. |
| C:\Projects\apilibrary\apilibrary.sln | Абсолютный путь к файлу из корня диска C: . |
| C:Projects\apilibrary\apilibrary.sln | Относительный путь из текущего каталога диска C: . |
Обратите внимание на различия между двумя последними путями. В обоих случаях задается необязательный описатель тома ( C: ), однако первый путь, в отличие от второго, начинается с корня указанного тома. В результате первый путь является абсолютным из корневого каталога диска C: , тогда как второй — относительным из текущего каталога C: . Использование второй формы пути в тех случаях, когда предполагается наличие первой, является распространенным источником ошибок, связанных с путями к файлам в Windows.
Можно определить, является ли путь к файлу полным (то есть, если путь не зависит от текущего каталога и не изменяется при изменении текущего каталога), вызвав Path.IsPathFullyQualified метод. Обратите внимание, что такой путь может включать сегменты с относительным путем к каталогу ( . и .. ), но при этом по-прежнему будет полным, если разрешенный путь всегда указывает на одно и то же место.
В приведенном ниже примере показано различие между абсолютными и относительными путями. Предполагается, что каталог D:\FY2018\ существует и вы не установили какой-либо текущий каталог для диска D:\ из командной строки перед запуском этого примера.
using System; using System.Diagnostics; using System.IO; using System.Reflection; public class Example < public static void Main(string[] args) < Console.WriteLine($"Current directory is ''"); Console.WriteLine("Setting current directory to 'C:\\'"); Directory.SetCurrentDirectory(@"C:\"); string path = Path.GetFullPath(@"D:\FY2018"); Console.WriteLine($"'D:\\FY2018' resolves to "); path = Path.GetFullPath(@"D:FY2018"); Console.WriteLine($"'D:FY2018' resolves to "); Console.WriteLine("Setting current directory to 'D:\\Docs'"); Directory.SetCurrentDirectory(@"D:\Docs"); path = Path.GetFullPath(@"D:\FY2018"); Console.WriteLine($"'D:\\FY2018' resolves to "); path = Path.GetFullPath(@"D:FY2018"); // This will be "D:\Docs\FY2018" as it happens to match the drive of the current directory Console.WriteLine($"'D:FY2018' resolves to "); Console.WriteLine("Setting current directory to 'C:\\'"); Directory.SetCurrentDirectory(@"C:\"); path = Path.GetFullPath(@"D:\FY2018"); Console.WriteLine($"'D:\\FY2018' resolves to "); // This will be either "D:\FY2018" or "D:\FY2018\FY2018" in the subprocess. In the sub process, // the command prompt set the current directory before launch of our application, which // sets a hidden environment variable that is considered. path = Path.GetFullPath(@"D:FY2018"); Console.WriteLine($"'D:FY2018' resolves to "); if (args.Length < 1) < Console.WriteLine(@"Launching again, after setting current directory to D:\FY2018"); Uri currentExe = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase, UriKind.Absolute); string commandLine = $"/C cd D:\\FY2018 & \"\" stop"; ProcessStartInfo psi = new ProcessStartInfo("cmd", commandLine); ; Process.Start(psi).WaitForExit(); Console.WriteLine("Sub process returned:"); path = Path.GetFullPath(@"D:\FY2018"); Console.WriteLine($"'D:\\FY2018' resolves to "); path = Path.GetFullPath(@"D:FY2018"); Console.WriteLine($"'D:FY2018' resolves to "); > Console.WriteLine("Press any key to continue. "); Console.ReadKey(); > > // The example displays the following output: // Current directory is 'C:\Programs\file-paths' // Setting current directory to 'C:\' // 'D:\FY2018' resolves to D:\FY2018 // 'D:FY2018' resolves to d:\FY2018 // Setting current directory to 'D:\Docs' // 'D:\FY2018' resolves to D:\FY2018 // 'D:FY2018' resolves to D:\Docs\FY2018 // Setting current directory to 'C:\' // 'D:\FY2018' resolves to D:\FY2018 // 'D:FY2018' resolves to d:\FY2018 // Launching again, after setting current directory to D:\FY2018 // Sub process returned: // 'D:\FY2018' resolves to D:\FY2018 // 'D:FY2018' resolves to d:\FY2018 // The subprocess displays the following output: // Current directory is 'C:\' // Setting current directory to 'C:\' // 'D:\FY2018' resolves to D:\FY2018 // 'D:FY2018' resolves to D:\FY2018\FY2018 // Setting current directory to 'D:\Docs' // 'D:\FY2018' resolves to D:\FY2018 // 'D:FY2018' resolves to D:\Docs\FY2018 // Setting current directory to 'C:\' // 'D:\FY2018' resolves to D:\FY2018 // 'D:FY2018' resolves to D:\FY2018\FY2018
Imports System.Diagnostics Imports System.IO Imports System.Reflection Public Module Example Public Sub Main(args() As String) Console.WriteLine($"Current directory is ''") Console.WriteLine("Setting current directory to 'C:\'") Directory.SetCurrentDirectory("C:\") Dim filePath As String = Path.GetFullPath("D:\FY2018") Console.WriteLine($"'D:\\FY2018' resolves to ") filePath = Path.GetFullPath("D:FY2018") Console.WriteLine($"'D:FY2018' resolves to ") Console.WriteLine("Setting current directory to 'D:\\Docs'") Directory.SetCurrentDirectory("D:\Docs") filePath = Path.GetFullPath("D:\FY2018") Console.WriteLine($"'D:\\FY2018' resolves to ") filePath = Path.GetFullPath("D:FY2018") ' This will be "D:\Docs\FY2018" as it happens to match the drive of the current directory Console.WriteLine($"'D:FY2018' resolves to ") Console.WriteLine("Setting current directory to 'C:\\'") Directory.SetCurrentDirectory("C:\") filePath = Path.GetFullPath("D:\FY2018") Console.WriteLine($"'D:\\FY2018' resolves to ") ' This will be either "D:\FY2018" or "D:\FY2018\FY2018" in the subprocess. In the sub process, ' the command prompt set the current directory before launch of our application, which ' sets a hidden environment variable that is considered. filePath = Path.GetFullPath("D:FY2018") Console.WriteLine($"'D:FY2018' resolves to ") If args.Length < 1 Then Console.WriteLine("Launching again, after setting current directory to D:\FY2018") Dim currentExe As New Uri(Assembly.GetExecutingAssembly().GetName().CodeBase, UriKind.Absolute) Dim commandLine As String = $"/C cd D:\FY2018 & """" stop" Dim psi As New ProcessStartInfo("cmd", commandLine) Process.Start(psi).WaitForExit() Console.WriteLine("Sub process returned:") filePath = Path.GetFullPath("D:\FY2018") Console.WriteLine($"'D:\\FY2018' resolves to ") filePath = Path.GetFullPath("D:FY2018") Console.WriteLine($"'D:FY2018' resolves to ") End If Console.WriteLine("Press any key to continue. ") Console.ReadKey() End Sub End Module ' The example displays the following output: ' Current directory is 'C:\Programs\file-paths' ' Setting current directory to 'C:\' ' 'D:\FY2018' resolves to D:\FY2018 ' 'D:FY2018' resolves to d:\FY2018 ' Setting current directory to 'D:\Docs' ' 'D:\FY2018' resolves to D:\FY2018 ' 'D:FY2018' resolves to D:\Docs\FY2018 ' Setting current directory to 'C:\' ' 'D:\FY2018' resolves to D:\FY2018 ' 'D:FY2018' resolves to d:\FY2018 ' Launching again, after setting current directory to D:\FY2018 ' Sub process returned: ' 'D:\FY2018' resolves to D:\FY2018 ' 'D:FY2018' resolves to d:\FY2018 ' The subprocess displays the following output: ' Current directory is 'C:\' ' Setting current directory to 'C:\' ' 'D:\FY2018' resolves to D:\FY2018 ' 'D:FY2018' resolves to D:\FY2018\FY2018 ' Setting current directory to 'D:\Docs' ' 'D:\FY2018' resolves to D:\FY2018 ' 'D:FY2018' resolves to D:\Docs\FY2018 ' Setting current directory to 'C:\' ' 'D:\FY2018' resolves to D:\FY2018 ' 'D:FY2018' resolves to D:\FY2018\FY2018
UNC-пути
UNC-пути (универсальное соглашение об именовании) используются для доступа к сетевым ресурсам и имеют следующий формат:
- Имя сервера или узла, которому предшествуют символы \\ . В качестве имени сервера может выступать имя компьютера NetBIOS, а также IP-адрес или полное доменное имя (поддерживаются адреса IPv4 и IPv6).
- Имя общего ресурса, которое отделяется от имени узла символами \ . Имя сервера и имя общего ресурса в совокупности образуют том.
- Имя каталога. Символ разделителя каталогов служит для разделения подкаталогов во внутренней иерархии каталога.
- Необязательное имя файла. Символ разделителя каталогов служит для разделения пути к файлу и его имени.
Ниже приводятся некоторые примеры UNC-путей:
| Путь | Description |
|---|---|
| \\system07\C$\ | Корневой каталог диска C: на компьютере system07 . |
| \\Server2\Share\Test\Foo.txt | Файл Foo.txt в тестовом каталоге тома \\Server2\Share . |
UNC-пути всегда должны быть полными. Они могут включать сегменты с относительным путем к каталогу ( . и .. ), однако они должны быть частью полного пути. Использовать относительные пути можно только посредством сопоставления UNC-пути с буквой диска.
Пути к устройствам DOS
В операционной системе Windows используется унифицированная объектная модель, которая указывает на все ресурсы, включая файлы. Эти пути к объектам доступны из окна консоли и предоставляются на уровень Win32 с использованием специальной папки с символьными ссылками, с которыми сопоставляются устаревшие пути DOS и UNC. Доступ к этой специальной папке осуществляется с использованием синтаксиса пути к устройству DOS, который может иметь одну из приведенных ниже форм:
Помимо использования буквы диска, вы можете указать том с помощью его GUID. Синтаксис будет иметь вид:
Синтаксис пути к устройству DOS поддерживается в реализациях платформы .NET для ОС Windows, начиная с версий .NET Core 1.1 и .NET Framework 4.6.2.
Путь к устройству DOS состоит из следующих компонентов:
-
Описатель пути к устройству ( \\.\ или \\?\ ), который идентифицирует путь как путь к устройству DOS.
Примечание. Описатель \\?\ поддерживается во всех версиях .NET Core, в .NET 5 и более поздних версий, а также в .NET Framework, начиная с версии 4.6.2.
Пути к устройству DOS полностью соответствуют определению и не могут начинаться с относительного сегмента каталога ( . или .. ). Они никогда не задаются относительно текущего каталога.
Пример: способы задать ссылку на один и тот же файл
В следующем примере демонстрируются некоторые способы задать ссылку на файл с использованием API в пространстве имен System.IO. В этом примере создается экземпляр объекта FileInfo и используются его свойства Name и Length, чтобы отобразить имя и длину файла.
using System; using System.IO; class Program < static void Main() < string[] filenames = < @"c:\temp\test-file.txt", @"\\127.0.0.1\c$\temp\test-file.txt", @"\\LOCALHOST\c$\temp\test-file.txt", @"\\.\c:\temp\test-file.txt", @"\\?\c:\temp\test-file.txt", @"\\.\UNC\LOCALHOST\c$\temp\test-file.txt", @"\\127.0.0.1\c$\temp\test-file.txt" >; foreach (var filename in filenames) < FileInfo fi = new FileInfo(filename); Console.WriteLine($"file : bytes"); > > > // The example displays output like the following: // file test-file.txt: 22 bytes // file test-file.txt: 22 bytes // file test-file.txt: 22 bytes // file test-file.txt: 22 bytes // file test-file.txt: 22 bytes // file test-file.txt: 22 bytes // file test-file.txt: 22 bytes
Imports System.IO Module Program Sub Main() Dim filenames() As String = < "c:\temp\test-file.txt", "\\127.0.0.1\c$\temp\test-file.txt", "\\LOCALHOST\c$\temp\test-file.txt", "\\.\c:\temp\test-file.txt", "\\?\c:\temp\test-file.txt", "\\.\UNC\LOCALHOST\c$\temp\test-file.txt", "\\127.0.0.1\c$\temp\test-file.txt">For Each filename In filenames Dim fi As New FileInfo(filename) Console.WriteLine($"file : bytes") Next End Sub End Module
Нормализация путей
Практически все передаваемые в API Windows пути нормализуются. При нормализации в Windows выполняются следующие действия:
- Идентифицируется путь.
- Текущий каталог применяется к неполным (относительным) путям.
- Выполняется канонизация разделителей каталогов.
- Вычисляются относительные компоненты каталога ( . для текущего и .. для родительского каталога).
- Удаляются некоторые символы.
Нормализация осуществляется неявно, но при необходимости вы можете выполнить ее явно, вызвав метод Path.GetFullPath, который создает оболочку для вызова функции GetFullPathName(). Также можно вызвать функцию GetFullPathName() Windows напрямую с помощью P/Invoke.
Идентификация пути
На первом шаге процесса нормализации осуществляется идентификация типа пути. Пути могут относиться к одной из нескольких категорий:
- Пути к устройствам: начинаются с двух разделителей и знака вопроса или точки ( \\? или \\. ).
- UNC-пути: начинаются с двух разделителей без знака вопроса или точки.
- Полные пути DOS: начинаются с буквы диска, разделителя томов и компонентов ( C:\ ).
- Пути к устаревшим устройствам ( CON , LPT1 ).
- Пути относительно корня текущего диска: начинаются с одного разделителя компонентов ( \ ).
- Пути относительно текущего каталога указанного диска: начинаются с буквы диска и разделителя томов, но не содержат разделителя компонентов ( C: ).
- Пути относительно текущего каталога: начинаются с любых других символов ( temp\testfile.txt ).
Тип пути определяет, будет ли каким-либо образом применяться текущий каталог. Кроме того, от типа пути зависит применяемый корень.
Работа с устаревшими устройствами
Если путь указывает на устаревшее устройство DOS, например CON , COM1 или LPT1 , он преобразуется в путь к устройству путем добавления перед ним последовательности \\.\ и возвращается в таком виде.
Путь, который начинается с имени устаревшего устройства, всегда интерпретируется как путь к устаревшему устройству с помощью метода Path.GetFullPath(String). Например, путь к устройству DOS CON.TXT будет выглядеть как \\.\CON , а путь к устройству DOS COM1.TXT\file1.txt будет выглядеть как \\.\COM1 .
Применение текущего каталога
Если путь не является полным, система Windows применяет к нему текущий каталог. К UNC-путям и путям к устройствам текущий каталог не применяется. Также текущий каталог не применяется к полным путям к диску с разделителем C:\ .
Если путь начинается с одного разделителя компонентов, применяется диск текущего каталога. Например, для пути к файлу \utilities и текущего каталога C:\temp\ в результате нормализации будет получен путь C:\utilities .
Если путь начинается с буквы диска, разделителя томов и не содержит разделителя компонентов, применяется последний текущий каталог, установленный из командной оболочки. Если последний текущий каталог не был установлен, применяется диск сам по себе. Например, для пути D:sources , текущего каталога C:\Documents\ и последнего текущего каталога D:\sources\ на диске D: в результате будет получен путь D:\sources\sources . Пути, задаваемые относительно диска, являются распространенными источниками ошибок программ и логики скрипта. Предположение, что путь, начинающийся с буквы и двоеточия, не является относительным, очевидно неверно.
Если путь не начинается с разделителя, применяются текущий диск и текущий каталог. Например, для пути к файлу filecompare и текущего каталога C:\utilities\ в результате будет получен путь C:\utilities\filecompare\ .
Применение относительных путей в многопотоковых приложениях (то есть в большинстве приложений) сопряжено с определенными рисками, поскольку текущий каталог задается на уровне процесса. Таким образом, любой поток может в любое время изменить текущий каталог. Начиная с версии .NET Core 2.1, вы можете вызвать метод Path.GetFullPath(String, String) для получения абсолютного пути на основе относительного и базового (текущий каталог) путей, относительно которых требуется выполнить разрешение.
Канонизация разделителей
Все символы косой черты ( / ) преобразуются в стандартные разделители Windows, то есть символы обратной косой черты ( \ ). Если они присутствуют, последовательность символов косой черты после первых двух таких символов свертывается в один символ косой черты.
Вычисление относительных компонентов
При обработке пути выполняется вычисление любых его компонентов или сегментов, которые состоят из одной или двух точек ( . или .. ):
- Если обнаруживается одна точка, текущий сегмент удаляется, поскольку он ссылается на текущий каталог.
- Если обнаруживаются две точки, удаляются текущий и родительский сегмент, поскольку в этом случае задается ссылка на родительский каталог. Родительские каталоги удаляются только в том случае, если они не находятся после корня пути. Корень пути зависит от его типа. Это будет диск ( C:\ ) для путей DOS, сервер или общий сетевой ресурс для UNC-путей ( \\Server\Share ) и префикс пути к устройству для путей к устройствам ( \\?\ или \\.\ ).
Удаление знаков
Помимо удаленных ранее разделителей и относительных сегментов во время нормализации также удаляются некоторые дополнительные знаки:
- Если сегмент заканчивается одной точкой, эта точка удаляется. (Сегмент одного или двойного периода нормализуется на предыдущем шаге. Сегмент из трех или более периодов не нормализован и фактически является допустимым именем файла или каталога.)
- Если путь не заканчивается разделителем, удаляются все конечные точки и пробелы (U+0020). Если последний сегмент содержит только одну или две точки, к нему применяется приведенное выше правило для относительных компонентов. Это правило устанавливает, что вы можете создать имя каталога с конечным пробелом, добавив разделитель после пробела.
Важно! Создавать имена каталогов или файлов с конечным пробелом нельзя. Наличие конечных пробелов может затруднить или исключить возможность доступа к каталогу. В связи с этим при попытке обработать каталоги или файлы, имена которых содержат конечные пробелы, происходит сбой приложения.
Пропуск нормализации
Как правило, любой путь, передаваемый в API Windows передается в функцию GetFullPathName и нормализуется. Существует одно важное исключение: путь к устройству, который начинается со знака вопроса, а не с точки. Если путь не начинается с последовательности \\?\ (обратите внимание на использование канонической формы с обратной косой чертой), он нормализуется.
Зачем нужно пропускать нормализацию? Существует три основных причины:
- Получение путей, которые в обычных обстоятельствах недоступны, но являются допустимыми. Например, невозможно каким-либо иным способом получить доступ к файлу или каталогу с именем hidden. .
- Повышение производительности за счет пропуска нормализации в тех случаях, когда нормализация уже выполнена.
- Только на платформе .NET Framework пропуск проверки длины пути MAX_PATH для использования путей длиной более 259 символов. Такое поведение допускается в большинстве API за некоторыми исключениями.
.NET Core и .NET 5 или более поздней версии обрабатывают длинные пути неявным образом и не выполняют проверку MAX_PATH . Проверка MAX_PATH применяется только для платформы .NET Framework.
Пропуск нормализации и проверки максимальной длины пути является единственным отличием между двумя видами синтаксиса путей к устройствам. В остальных аспектах они идентичны. Пропуск нормализации следует использовать с осторожностью, поскольку в этом случае легко получить пути, при работе с которыми в обычных приложениях будут возникать трудности.
Пути, начинающиеся с последовательности \\?\ , по-прежнему нормализуются, если явно передать их в функцию GetFullPathName.
Вы можете передавать пути длиной более MAX_PATH символов в функцию GetFullPathName без \\?\ . Она поддерживает пути произвольной длины, которая ограничивается лишь максимальным размером строки, поддерживаемым в Windows.
Регистр символов и файловая система Windows
Особенность файловой системы Windows заключается в том, что пользователи и разработчики, имеющие дело с другими операционными системами, могут сталкиваться с проблемами из-за того, что в именах каталогов и путях не учитывается регистр символов. Это значит, что в именах каталогов и файлов сохраняется регистр строк, используемый в момент их создания. Например, вызов метода
Directory.Create("TeStDiReCtOrY");
Directory.Create("TeStDiReCtOrY")
создает каталог с именем TeStDiReCtOrY. Если переименовать каталог или файл так, чтобы изменился регистр символов, в имени будет отражен регистр, используемый в момент переименования. Например, следующий код переименовывает файл test.txt в Test.txt:
using System.IO; class Example < static void Main() < var fi = new FileInfo(@".\test.txt"); fi.MoveTo(@".\Test.txt"); >>
Imports System.IO Module Example Public Sub Main() Dim fi As New FileInfo(".\test.txt") fi.MoveTo(".\Test.txt") End Sub End Module
Тем не менее при сравнении имен каталогов и файлов регистр символов не учитывается. Если выполнить поиск файла с именем "test.txt", API файловой системы .NET будут игнорировать регистр символов при сравнении. Таким образом, при поиске файла "test.txt" будут возвращены совпадения для файлов "Test.txt", "TEST.TXT", "test.TXT", а также любых других их вариантов с различным сочетанием букв в верхнем и нижнем регистре.
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
c++ include как указать полный путь
Всем привет! Я пытаюсь подключить библиотеку через полный путь, так:
include
Она реально там лежит. Но пишет «Нет такого файла или каталога». Пробовал всяко. Я уже молчу чтобы путь искался сам:
include
include «gtk/gtk.h»
Реально достали убогие языки. Сам файл, где подключение библиотеки прописано я компилирую (собственно при компиляции ошибка), компилирую так: g++ /media/login/811HG26G2RT1F3W1/progi_c++/gtk.cpp -o gtk
Может папку так нельзя называть «progi_c++», но ошибка то о другом. Да, библиотека gtk идет в комплекте с ubuntu 20.04, ее я и пытаюсь подключить. А вообще это отдельная библиотека, то есть ее можно на любую ОС ставить. А вообще мне нужна библиотека gui, чтоб там писать на php можно было, php чтоб 7,0 - 7,4. Нужно что-то легкое, известное, с императивным подходом и с русской документацией или материалов на русском чтобы было много.
wadic2
01.09.20 20:58:36 MSK
Может папку так нельзя называть «progi_c++»
Папку лучше называть батей, ну или отцом, а так его лучше не называть.
BRE ★★
( 01.09.20 21:03:06 MSK )

Прежде чем называть что-либо убогим, изучите вопрос получше
RyanGosling
( 01.09.20 21:08:22 MSK )
Ответ на: комментарий от RyanGosling 01.09.20 21:08:22 MSK
Вы знаете что такое истина? Это когда ты попробовал и то и то и знаешь что лучше. Попробуйте php (да поначалу что то покажется не удобным может быть, но если Вы пишите на с, на с++, на ассемблере, , то не удобного будет в 10 раз больше). А если учить php первым или пройдет время после изучения, то лучше языка по синтаксису я ни знаю (реализацию ооп и исключений там не берем, они плохи). Я конечно не все языки знаю, но основные видел и кроме того на php смотрел критически, просто там все к месту, не подкопаешься. Знак $ только там лишний, но не мешает, просто писать его нужно. Про отсутствие многопоточности в php я знаю, тут смириться нужно, этот язык вообще про другое, другая архитектура, ну не заложена там многопоточность. Давайте не будем выяснять какой язык круче. Спасибо конечно за ссылку, но я не понял что там. Мне нужен прямой ответ, с примером. И так несколько часов бьюсь (как Вы там говорите? Тупой язык с++?) над этим языком. Спросите любого прогера есть ли у него проблемы с подключением файлов и он ответит нет, во всяком те языки что я знаю, там нет таких проблем. А Вы говорите с++ хорош. И да, это не только мое мнение что с++ плох.
wadic2
( 01.09.20 21:53:38 MSK ) автор топика

Замена модульности в C и C++ убогая, это так. Но ты хочешь неправильного, абсолютные пути в include не пишут, помимо прочего, это некроссплатформенно. Даже если у тебя это каким-то чудом получится, человек, которому придётся поддерживать твой код спустя годы, будет проклинать тебя, искать твой домашний адрес, чтобы придти к тебе с топором под шубой.
Надо смотреть, какая у тебя система сборки (cmake, autotools, meson…) и как в ней принято подключать GTK.
У тебя, правда, ещё из-за снапа может быть засада. Библиотеки такого уровня (если тебе от них не нужно что-то очень-очень специфическое, что есть только в последней версии) лучше ставить из репозитория своего дистрибутива.
Спасибо конечно за ссылку, но я не понял что там. Мне нужен прямой ответ, с примером.
А там и есть примеры. Как для прямого вызова g++, так и для случая с использованием cmake (причём для библиотек вроде GTK пример с cmake будет ещё проще).
P.S. Путь к твоим исходникам наводит на подозрение, что ты компилируешь исходники прямо с флешки. Если это так, возможны другие проблемы, с которыми ты ещё не столкнулся.
P.P.S. Человек, который задаёт вопросы начального уровня и при этом выносит скороспелое суждение об «убогости» каких-либо языков, производит на посетителей форума очень нехорошее впечатление. Очень. Поэтому если некоторые несдержанные люди в этой теме над тобой будут глумиться, винить в этом кого-то, кроме себя, будет не самой удачной идеей.
hobbit ★★★★★
( 01.09.20 21:59:31 MSK )
Последнее исправление: hobbit 01.09.20 22:17:28 MSK (всего исправлений: 6)
как передавать путь к файлу?
Если программа лежит в папке "D:Proga\Bin", то надо выйти на уровень вверх:
std::string path("..\\File\\file.txt");
(Двойная косая черта нужна, так как в Си одинарная такая черта обозначает управляющий символ).
Вариант, как могла бы выглядеть ваша программа:
#include #include #include int main(int argc, char* argv[]) < if (argc >1) < std::string path(argv[1]); std::ofstream fout(path); // Тут работаем с файлом >else < std::cout return 0; >
c++ include как указать полный путь
Всем привет! Я пытаюсь подключить библиотеку через полный путь, так:
include
Она реально там лежит. Но пишет «Нет такого файла или каталога». Пробовал всяко. Я уже молчу чтобы путь искался сам:
include
include «gtk/gtk.h»
Реально достали убогие языки. Сам файл, где подключение библиотеки прописано я компилирую (собственно при компиляции ошибка), компилирую так: g++ /media/login/811HG26G2RT1F3W1/progi_c++/gtk.cpp -o gtk
Может папку так нельзя называть «progi_c++», но ошибка то о другом. Да, библиотека gtk идет в комплекте с ubuntu 20.04, ее я и пытаюсь подключить. А вообще это отдельная библиотека, то есть ее можно на любую ОС ставить. А вообще мне нужна библиотека gui, чтоб там писать на php можно было, php чтоб 7,0 - 7,4. Нужно что-то легкое, известное, с императивным подходом и с русской документацией или материалов на русском чтобы было много.
wadic2
01.09.20 20:58:36 MSK
Может папку так нельзя называть «progi_c++»
Папку лучше называть батей, ну или отцом, а так его лучше не называть.
BRE ★★
( 01.09.20 21:03:06 MSK )

Прежде чем называть что-либо убогим, изучите вопрос получше
RyanGosling
( 01.09.20 21:08:22 MSK )
Ответ на: комментарий от RyanGosling 01.09.20 21:08:22 MSK
Вы знаете что такое истина? Это когда ты попробовал и то и то и знаешь что лучше. Попробуйте php (да поначалу что то покажется не удобным может быть, но если Вы пишите на с, на с++, на ассемблере, , то не удобного будет в 10 раз больше). А если учить php первым или пройдет время после изучения, то лучше языка по синтаксису я ни знаю (реализацию ооп и исключений там не берем, они плохи). Я конечно не все языки знаю, но основные видел и кроме того на php смотрел критически, просто там все к месту, не подкопаешься. Знак $ только там лишний, но не мешает, просто писать его нужно. Про отсутствие многопоточности в php я знаю, тут смириться нужно, этот язык вообще про другое, другая архитектура, ну не заложена там многопоточность. Давайте не будем выяснять какой язык круче. Спасибо конечно за ссылку, но я не понял что там. Мне нужен прямой ответ, с примером. И так несколько часов бьюсь (как Вы там говорите? Тупой язык с++?) над этим языком. Спросите любого прогера есть ли у него проблемы с подключением файлов и он ответит нет, во всяком те языки что я знаю, там нет таких проблем. А Вы говорите с++ хорош. И да, это не только мое мнение что с++ плох.
wadic2
( 01.09.20 21:53:38 MSK ) автор топика

Замена модульности в C и C++ убогая, это так. Но ты хочешь неправильного, абсолютные пути в include не пишут, помимо прочего, это некроссплатформенно. Даже если у тебя это каким-то чудом получится, человек, которому придётся поддерживать твой код спустя годы, будет проклинать тебя, искать твой домашний адрес, чтобы придти к тебе с топором под шубой.
Надо смотреть, какая у тебя система сборки (cmake, autotools, meson…) и как в ней принято подключать GTK.
У тебя, правда, ещё из-за снапа может быть засада. Библиотеки такого уровня (если тебе от них не нужно что-то очень-очень специфическое, что есть только в последней версии) лучше ставить из репозитория своего дистрибутива.
Спасибо конечно за ссылку, но я не понял что там. Мне нужен прямой ответ, с примером.
А там и есть примеры. Как для прямого вызова g++, так и для случая с использованием cmake (причём для библиотек вроде GTK пример с cmake будет ещё проще).
P.S. Путь к твоим исходникам наводит на подозрение, что ты компилируешь исходники прямо с флешки. Если это так, возможны другие проблемы, с которыми ты ещё не столкнулся.
P.P.S. Человек, который задаёт вопросы начального уровня и при этом выносит скороспелое суждение об «убогости» каких-либо языков, производит на посетителей форума очень нехорошее впечатление. Очень. Поэтому если некоторые несдержанные люди в этой теме над тобой будут глумиться, винить в этом кого-то, кроме себя, будет не самой удачной идеей.
hobbit ★★★★★
( 01.09.20 21:59:31 MSK )
Последнее исправление: hobbit 01.09.20 22:17:28 MSK (всего исправлений: 6)
Как указать путь к файлу в c
У меня было так
#define DATA_FILE _T("C://set.ds")
Я открывал этот файл, при необходимости он создавался — и все было бы хорошо, но
#define DATA_FILE _T("C://Program Files//Internet Explorer//PLUGINS//set.ds")
И все больше файл открываться не хочет! (и не создается) Я больше ничего не менял в программе — значит виноваты эти строки. Подскажите, плиз.
03.03.06 22:54: Перенесено модератором из 'C/C++' — Павел Кузнецов
Re: Как правильно писать путь к файлу?
| От: | LuciferMoscow |
| Дата: | 03.03.06 10:19 |
| Оценка: |
Здравствуйте, AlexDav, Вы писали:
AD>У меня было так
AD>
AD>#define DATA_FILE _T("C://set.ds") AD>
AD>Я открывал этот файл, при необходимости он создавался — и все было бы хорошо, но
AD>Я заменил на
AD>
AD>#define DATA_FILE _T("C://Program Files//Internet Explorer//PLUGINS//set.ds") AD>
AD>И все больше файл открываться не хочет! (и не создается) Я больше ничего не менял в программе — значит виноваты эти строки. Подскажите, плиз.
Попробуй путь взять в кавычки. У тебя есть пробел в пути к файлу
const TCHAR DATA_FILE[]_T("\"C://Program Files//Internet Explorer//PLUGINS//set.ds\"");
Re: Как правильно писать путь к файлу?
| От: | HiSH | http://m0riarty.ya.ru |
| Дата: | 03.03.06 10:21 | |
| Оценка: | 2 (2) | |
Здравствуйте, AlexDav, Вы писали:
AD>
AD>#define DATA_FILE _T("C://set.ds") AD>
AD>Я открывал этот файл, при необходимости он создавался — и все было бы хорошо, но
AD>Я заменил на
AD>
AD>#define DATA_FILE _T("C://Program Files//Internet Explorer//PLUGINS//set.ds") AD>
AD>И все больше файл открываться не хочет! (и не создается) Я больше ничего не менял в программе — значит виноваты эти строки. Подскажите, плиз.
А зачем двойные слеши? Должно быть или "c:\\program files\\. ", или "c:/program files/. "
Re: Как правильно писать путь к файлу?
| От: | rg45 |
| Дата: | 03.03.06 10:24 |
| Оценка: |
Здравствуйте, AlexDav, Вы писали:
AD>У меня было так
AD>
AD>#define DATA_FILE _T("C://set.ds") AD>
AD>Я открывал этот файл, при необходимости он создавался — и все было бы хорошо, но
AD>Я заменил на
AD>
AD>#define DATA_FILE _T("C://Program Files//Internet Explorer//PLUGINS//set.ds") AD>
AD>И все больше файл открываться не хочет! (и не создается) Я больше ничего не менял в программе — значит виноваты эти строки. Подскажите, плиз.
1. Либо "C://set.ds" либо "C:/set.ds" — двойной слэш — это лишний символ в строке, хотя большинством фунций "глотается" нормально.
2. Чтобы ответить, все таки, что не так, нужно видеть, как используется эта строка.
Вполне возможно, что проблема в пробелах, которые присутствуют во втором варианте и которых нет в первом.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: Как правильно писать путь к файлу?
| От: | AlexDav |
| Дата: | 03.03.06 10:27 |
| Оценка: |
Здравствуйте, HiSH, Вы писали:
HSH>А зачем двойные слеши? Должно быть или "c:\\program files\\. ", или "c:/program files/. "
Так вот зачем эти странные палочки?! И точно работает
Re[2]: Как правильно писать путь к файлу?
| От: | rg45 |
| Дата: | 03.03.06 10:27 |
| Оценка: |
R>1. Либо "C://set.ds" либо "C:/set.ds" — двойной слэш — это лишний символ в строке, хотя большинством фунций "глотается" нормально.
Написал не то, что хотел, надо было так:
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: Как правильно писать путь к файлу?
| От: | RevSegment |
| Дата: | 03.03.06 10:34 |
| Оценка: |
Здравствуйте, AlexDav, Вы писали:
AD>У меня было так
AD>
AD>#define DATA_FILE _T("C://set.ds") AD>
AD>Я открывал этот файл, при необходимости он создавался — и все было бы хорошо, но
AD>Я заменил на
AD>
AD>#define DATA_FILE _T("C://Program Files//Internet Explorer//PLUGINS//set.ds") AD>
AD>И все больше файл открываться не хочет! (и не создается) Я больше ничего не менял в программе — значит виноваты эти строки. Подскажите, плиз.
А так не пробовал?
"c:\\Folder One\\Folder Two\\file.ext"
. << RSDN@Home 1.1.4 stable SR1 rev. 568>>
. опыт приходит во время боя .<>
Re[2]: Как правильно писать путь к файлу?
| От: | AlexDav |
| Дата: | 03.03.06 10:46 |
| Оценка: |
Здравствуйте, LuciferMoscow, Вы писали:
LM>Попробуй путь взять в кавычки. У тебя есть пробел в пути к файлу
LM>
LM>const TCHAR DATA_FILE[]_T("\"C://Program Files//Internet Explorer//PLUGINS//set.ds\""); LM>
я попробовал такой путь "C:/Data/set.ds" работает — т.е. ты (можно на ты?) это пробелы, но как ты написал тоже не прокатывает?? Что Делать.
Re[3]: Как правильно писать путь к файлу?
| От: | ekamaloff |
| Дата: | 03.03.06 10:50 |
| Оценка: |
Здравствуйте, AlexDav, Вы писали:
AD>я попробовал такой путь "C:/Data/set.ds" работает — т.е. ты (можно на ты?) это пробелы, но как ты написал тоже не прокатывает?? Что Делать.
Покажи где ты ее используешь и на каком варианте строки ты сейчас остановился.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[4]: Как правильно писать путь к файлу?
| От: | AlexDav |
| Дата: | 03.03.06 11:07 |
| Оценка: |
Здравствуйте, ekamaloff, Вы писали:
E>Покажи где ты ее используешь и на каком варианте строки ты сейчас остановился.
Прошу прощения за MFC
#define DATA_FILE _T("\"C:\\Program Files\\Internet Explorer\\PLUGINS\\set.ds\"") . UINT nFlags = CFile::typeBinary|CFile::modeWrite; if(_waccess(DATA_FILE,0)) // надо его создать? < nFlags |= CFile::modeCreate; bCanSave = TRUE; >else < bCanSave = CanSerialize(); // всегда TRUE :) > if(bCanSave) < CFile file; CFileException fe; if(file.Open(DATA_FILE, nFlags, &fe)) // Вот и не посредственное использование < CArchive ar(&file, CArchive::store); Serialize(ar); ar.Close(); >file.Close(); >
Re[5]: Как правильно писать путь к файлу?
| От: | AlexDav |
| Дата: | 03.03.06 13:35 |
| Оценка: |
Хотите верти — хотите нет, но
#define DATA_FILE _T("C:\\Program Files\\Internet Explorer\\PLUGINS\\set.dln")
просто начала работать и все! Зуб даю кроме этой строчки в программе ничего не менял!
Re[6]: Как правильно писать путь к файлу?
| От: | rg45 | |
| Дата: | 03.03.06 13:39 | |
| Оценка: | 4 (1) | |
Здравствуйте, AlexDav, Вы писали:
AD>Хотите верти — хотите нет, но
AD>
AD>#define DATA_FILE _T("C:\\Program Files\\Internet Explorer\\PLUGINS\\set.dln") AD>
AD>просто начала работать и все! Зуб даю кроме этой строчки в программе ничего не менял!
Впервоначальном варианте у тебя все слэши были двойные. А петерь вместо них одинарные бэк-слэши (литерал "\\" автоматически преобразуется в одинарный бэк-слэш). Значит, какая то из функций не могла вынести присутствия лишних символов в строке.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[6]: Как правильно писать путь к файлу?
| От: | i-maverick |
| Дата: | 03.03.06 13:48 |
| Оценка: |
Здравствуйте, AlexDav, Вы писали:
AD>Хотите верти — хотите нет, но
AD>
AD>#define DATA_FILE _T("C:\\Program Files\\Internet Explorer\\PLUGINS\\set.dln") AD>
AD>просто начала работать и все! Зуб даю кроме этой строчки в программе ничего не менял!
Тебе ведь так и сказали — нужно либо одинарный прямой слэш, либо двойной обратный.
Ты бы хоть разобрался, зачем тут двойной слэш, чтоб больше не путаться.
Re[7]: Как правильно писать путь к файлу?
| От: | AlexDav |
| Дата: | 03.03.06 13:54 |
| Оценка: |
Здравствуйте, i-maverick, Вы писали:
IM>Тебе ведь так и сказали — нужно либо одинарный прямой слэш, либо двойной обратный.
IM>Ты бы хоть разобрался, зачем тут двойной слэш, чтоб больше не путаться.
Ну ладно ругать то сразу — никто же не сказал что надо весь проект перекомпилить что бы подхватил эту дефайну
Спасибо — за время потраченное на меня
Как указать путь создаваемого файла в c++?
чтобы при запуске программы она создавала на рабочем столе файл, на любом компьютере где бы не была запущена программа?
- Вопрос задан более трёх лет назад
- 868 просмотров
Комментировать
Решения вопроса 2

Для правильного вопроса надо знать половину ответа
Переменная среды USERPROFILE
Ответ написан более трёх лет назад
Нравится 1 1 комментарий
Не советую.
Программист на «си с крестами» и не только
1. Нам придётся работать с юникодными (wchar_t* / wstring) именами файлов. Использовать функции wfopen или CreateFile .
2. Чтобы заполучить путь к рабочему столу, надо исполнить вот что.
std::wstring desktopPath; wchar_t tmp[MAX_PATH + 1]; if (SHGetSpecialFolderPathW(HWND_DESKTOP, tmp, CSIDL_DESKTOPDIRECTORY, FALSE)) desktopPath = tmp;
Не забудь подключить к программе соответствующие хедер и библиотеку, загугли уж сам, какие нужны.
Ответ написан более трёх лет назад
Gagatyn @Gagatyn Автор вопроса
Mercury13 а вот еще вопрос, а почему всегда вы все пишете "std:: . " , это как то влияет на работу кода? Можно же вы знаете написать "using namespace std;"
На работу не влияет. Но using namespace крайне не рекомендуется в хедерах, за одним интересным исключением (см. хедеры C++ Builder) — весь хедер вносится в одно пространство имён, а затем using namespace.