Portál AbcLinuxu, 2. května 2025 20:33
Né, práci ještě nemám.Za předpokladu, že bych stvořil technoklášter, kde by lidi mohli meditovat nad algoritmy a programovat od rána do večera, aniž by byli rušeni problémy běžných smrtelníků; šel by jsi k nám šířit programátorskou moudrost, studovat učení, které těší strojového boha a pást beránky?
Naštěstí je tu jedno chytré, kterému je to ukradené ... použít unicode verzi (třeba CreateFileW) a skutečnou absolutní cestu ("\\?\C:\bla\bla/bla"), tak se cesta pošle rovnou k filesystému a nebude se jednat o "C:\bla\bla\" + "bla", ale o "C:\bla\" + "bla/bla".Skutečně? Zkoušel jsi to? Já tomu nevěřim. V dokumentaci ke
CreateFile
se píše:
lpFileName [in]
The name of the file or device to be created or opened. You may use either forward slashes (/) or backslashes (\) in this name.
Imho žádným rozumným způsobem nevytvoříš '/' ve filename ve windows, a i kdybys to nějak nahackoval, běžné windows aplikace vč. exploreru s tím nepočítají, je to zakázany znak, tudíž je zcela na místě v Qt nepoužívat QDir::Separator
.
Naming Conventions The following fundamental rules enable applications to create and process valid names for files and directories, regardless of the file system:
- Use any character in the current code page for a name, including Unicode characters and characters in the extended character set (128–255), except for the following reserved characters:
- / (forward slash)
Z toho mi vyplívá, že to nemáte používat, pokud chcete kompatibility se všemi filesystémy (né jen NTFS). Nezní to tedy jako zákaz, ale doporučení.
Dále
The Windows API has many functions that also have Unicode versions to permit an extended-length path for a maximum total path length of 32,767 characters. This type of path is composed of components separated by backslashes, each up to the value returned in the lpMaximumComponentLength parameter of the GetVolumeInformation function (this value is commonly 255 characters). To specify an extended-length path, use the "\\?\" prefix. For example, "\\?\D:\very long path".A dále
There is no need to perform any Unicode normalization on path and file name strings for use by the Windows file I/O API functions because the file system treats path and file names as an opaque sequence of WCHARs. Any normalization that your application requires should be performed with this in mind, external of any calls to related Windows file I/O API functions.A dále poznámka, že shell (průzkumník) je hodně hloupej a na takových cestách se může rozbít.
The shell and the file system have different requirements. It is possible to create a path with the Windows API that the shell user interface is not able to interpret properly.A nejedná se jen o shell, ale o spoustu (většinu) programů. Všetně programů od MS. To ale neznamená, že budu, jako ten kdo napsal zápisek, vnucovat špatné chování, aby se i jeho program rozbil.
A nejedná se jen o shell, ale o spoustu (většinu) programů. Všetně programů od MS. To ale neznamená, že budu, jako ten kdo napsal zápisek, vnucovat špatné chování, aby se i jeho program rozbil.Nechápu, kdes došel k tomu, že to je špatné chování. Jestli potřebuješ Qt k napsání low-level filesystem utilit, tak použiješ specializované funkce, to je jasné. Běžné Qt I/O API je high-level abstrakce, u které je naopak dobře, že se chová stejně jako Win shell. Přijde mi to jako snaha být papežtější než papež.
\\?\
) a žádné změny se v tomto ohledu neplánují.
Tedy kdo používá long paths hodně riskuje. Ano, ve Windows světě je tohle obrovský problém již od nepaměti a žádné řešení se stále nerýsuje #!/bin/sh
function usage()
{
echo "Usage: $0 <label> <device>"
exit 1
}
dev="$2"
label="$1"
[ $# -eq 2 ] || usage
[ -b "$dev" ] || usage
dd if=/dev/zero of="$dev" bs=1M count=1
mkudffs --media-type=hd --blocksize=512 --utf8 --lvid="$label" --vid="$label" --fsid="$label" "$dev"
Ještě bych moh zkusit jak to pude přečíst/zapsat/smazat pod sedmičkama...
Pismenka jednotek jsou ten nejhorsi hell na svete. A ty spatny lomitka tomu jeste pridavaj.
char path[] = "c:\test\con"; FILE *f = fopen(path, "w");
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.