This case is used for the mix of windows and UNIX based os's. When used symlink() its works fine for UNIX/Linux but when same applied on windows instead of a symbolic link file .system file gets created.
Is there any C API I can use for which supports both OS's.
Thanks for your help!
Related
If you have a program that writes to an output file in C, how do you access/see that output file? For instance, I'm trying to write a program that writes the values from a .ppm image file to another .ppm image file, but I don't know how to access the output file after I've done so. I know that's a pretty general question, but I don't have a block of code I can share just yet.
When creating a file with fopen by only specifying a file name, without specifying a path, then the file will be put in the current working directory of your program.
If you are using an integrated development environment (IDE) to launch your program, then you can probably see and set your program's initial working directory in your IDE. If you are running your program directly from a command-line shell, then the file will be placed in the current working directory of the shell.
On most operating systems, you can also determine your program's current working directory by calling a certain function provided by the operating system. For example, on POSIX-compliant operating systems, such as Linux, you can call getcwd. On Microsoft Windows, you can call _getcwd or GetCurrentDirectory. That way, you should easily be able to find out in which directory your file is being created.
An application that has been running just fine with Windows XP and Windows 7 suddenly developed problems with Windows 10 Pro. However, with Windows 10 IoT Enterprise, it seems to work fine. It also seemed to work fine back in May of 2018 with Windows 10, yet with newer installs of Windows 10, it doesn't work.
After some investigation, we found that the application seems to be unable to create the set of files that it uses for persistent data with Windows 10 Pro.
Looking further, we found that the complete pathname was incorrect. It appears that the pathname to the directory where files were being stored, though not properly constructed, worked fine with Windows XP and Windows 7, but not with Windows 10 Pro.
The pathname being generated looked like this (those are path backslashes and not C/C++ backslashes for escaping a character):
\C:\DirA\DirB\DirC
while the corrected pathname being generated looks like this:
\\.\C:\DirA\DirB\DirC
Reading MSDN's article on Naming Files, Paths, and Namespaces, I am a bit confused about what appears to be a number of different ways that a valid pathname can be constructed. It appears that different Windows filesystems (FAT16, FAT32, NTFS, etc.) have different naming conventions.
What is the pathname format I should use so that my application will be able to create and open files in a specific directory on a local drive C: with multiple different versions of Windows? I am specifically interested in Windows 7, POSReady 7, Windows 10, and Windows 10 IoT Enterprise (which is not the same as Windows 10 IoT).
I am using the Win32 API CreateFile() function to create/open the files.
What is the pathname format I should use so that my application will be able to create and open files in a specific directory on a local drive C: with multiple different versions of Windows?
You should be using:
C:\DirA\DirB\DirC
Or, if you need to access a pathname longer than MAX_PATH, and don't/can't opt in to the new longPathAware feature introduced in Windows 10 version 1607:
\\?\C:\DirA\DirB\DirC
DO NOT use \C:\DirA\DirB\DirC, this is not correctly formatted.
You should not need to use \\.\C:\DirA\DirB\DirC, though it will work. Just be aware that:
The "\\.\" prefix will access the Win32 device namespace instead of the Win32 file namespace.
Typically, you would use \\.\ only when accessing local devices, like physical volumes, serial/parallel ports, named pipes, mailslots, etc. Not when accessing entries on the file system.
Basically I have some C/C++ code that I need to build and debug on a Linux machine. Unfortunately, my windows laptop doesn't have enough free hard space to install some Linux dist nor does it have enough free RAM to comfortably run VM.
Until now, I dealt with it rather comfortably using WSL, but the scale was rather small. It was easy to edit and debug 2-3 .c files through CLI and gdb, but it became really annoying on a large scale projects.
I want something simple as "edit code in windows IDE [X], compile it on remote Linux/WSL (the project uses Makefiles), and preferably debug it via gdb".
VS has something close to what I want, but it can't deal with existing Linux projects. It needs to create a new configuration which is alien to the project's Makefile.
I know this question is a bit old, but I think the solution is to make a symlink between your WSL folder and the Window's folder. This is how I handled it for a Ubuntu-20.04 WSL:
Access PowerShell in Administrator mode
Type cmd.exe in the PowerShell
Once cmd.exe is opened, type mklink /d C:\<path_to_your_Windows_folder> \\wsl$\Ubuntu-20.04\home\<your_user>\<path_to_your_WSL_folder>
EDIT
This was tested under Windows 10 Version 2004 with WSL2
I'm unsure about C and C++ but it sounds like this is exactly the same as how i work in node and javascript every day.
I checkout my code using git inside WSL to a location like /mnt/c/code/myproject. Then using sublime/VS code/webstorm i edit the files in windows in the location c:\code\myproject this works really well and have been doing this every day for over a year.
Things to be aware of are that you need to ensure that your editor of choice saves files with linux line endings and that all command line operations are done inside WSL.
Please see this article to see the differences between windows and linux files and how this works inside the WSL.
I want something simple as "edit code in windows IDE , compile it on remote linux/WSL
You will have something as simple as that.
Only with Windows 19.03 though:
See "Updated WSL in Windows 10 version 1903 lets you access Linux files from Windows"
Microsoft's Craig Loewen says:
In the past, creating and changing Linux files from Windows resulted in losing files or corrupting data. Making this possible has been a highly requested and long anticipated feature. We're proud to announce you can now easily access all the files in your Linux distros from Windows.
So how does this work? He goes on to explain:
To put it briefly: a 9P protocol file server facilitates file related requests, with Windows acting as the client.
We've modified the WSL init daemon to include a 9P server. This server contains protocols that support Linux metadata, including permissions.
There is a Windows service and driver that acts as the client and talks to the 9P server (which is running inside of a WSL instance).
Client and server communicate over AF_UNIX sockets, since WSL allows interop between a Windows application and a Linux application using AF_UNIX as described in this post.
Warning:
The old rules still apply, you should NOT access your Linux files inside of the AppData folder!
If you try to access your Linux files through your AppData folder, you are bypassing using the 9P server, which means that you will not have access to your Linux files, and you could possibly corrupt your Linux distro.
I am working at an OS independent file manager (mostly Windows and Linux), and I am wondering if there is a Linux way to open a file in its default viewer. For example, open a html file with Firefox, an .avi with vlc, and so on.
On Windows, there is a function ShellExecute() that does that, but my understanding is that on Linux it is not that simple, and each desktop environment has a specific way.
I would appreciate any help with this.
You could use xdg-open(1). It works on all freedesktop compliant desktops.
The default programs for different mime-types are defined in /etc/mailcap and $HOME/.mailcap, indexed by file type and action (display, edit, print). The command line interface is run-mailcap. See also the manpages run-mailcap(1) and mailcap(5).
It depends what desktop environment you're using in Linux. Gnome for example has a MIME database you can use to find out what to launch for a given file.
Sahil Muthoo has given you good advice. I will just give further examples.
If xdg-open is not available you can also use "gnome-open" for GNOME and "kfmclient" for KDE.
I'm trying to port an application written in C from linux to windows.
At the moment I'm done fixing the 'hard' parts like missing posix features and the like.
The application compiles, links and works on Windows now (except for the fork() stuff which will be replaced with windows service code later).
The only problem I'm having now is that within the MSYS shell it all works (this maps unix paths for me).
Outside of the MSYS shell it won't work because ~ is not available.
I'm looking for the best way to set the windows user home within my #ifdef stuff.
I read about %USERPROFILE% somewhere but that doesn't seem to work.
Use SHGetKnownFolderPath (Vista+) or SHGetFolderPath depending on your Windows version.
I think you should use the SHGetFolderLocation API:
http://msdn.microsoft.com/en-us/library/bb762180%28VS.85%29.aspx
well not enought, you should even retrieve the ID of the user folder, but by starting at the doc location above you should have all what you neeed.
This should works on any windows version.