I'm writing a program that a user loads a file (txt or csv) in which it reads newlines and commas as new object delimiters. Each new object is put into an array creating a new array object each time. There is also several tests in place to check the data being read into the program to return an error if there are characters that can't be used for a file or folder. There is an option to clean the data being read in which it will read a line of data, then run several replace statements on it to change illegal characters for safe characters. Somewhere in my code it is cleaning the data, replacing the illegal characters then trying to create files off the array objects but even though I've cleaned the data of illegal characters, upon creation, visual studio is spitting out its own error saying illegal characters (not the error I built as a test). Any ideas on why this might be are greatly appreciated. Bellow is the code in question. -
private void Runbtn_Click(object sender, EventArgs e)
-
-
{//1
-
string[] lines = null; //create lines array
-
-
using (StreamReader sr = new StreamReader(@newobject.csvDirectory))
-
{//2
-
string fileContents = sr.ReadToEnd();
-
lines = fileContents.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
-
}//2
-
-
bool safeLength = true;
-
-
if (Filebtn.Checked == true)
-
{//3
-
-
for (int i = 0; i < lines.Length; i++)
-
{//4
-
if (lines[i].Length > MAXFILENAME)
-
{//5
-
newobject.fileNameError();
-
safeLength = false;
-
break;
-
}//5
-
-
}//4
-
-
if (safeLength == true)
-
{//4
-
-
if (cleancheckbox.Checked == true)
-
{ //5
-
newobject.creationInProgress(); // prompts that files are being made
-
-
//create the child form
-
newobject.ParentFolder = newfldrbx.Text;
-
-
// Specify a folder to house everything new inside
-
//This is not the folder that holds the created files/folders
-
// based off of csv/txt values
-
string outputdir = folderBrowserDialog1.SelectedPath;
-
-
//Create a new subfolder under the current active folder
-
// this new folder will hold all files/folders created
-
// per project.
-
string newPath = System.IO.Path.Combine(outputdir, newobject.ParentFolder);
-
-
// Create the subfolder
-
System.IO.Directory.CreateDirectory(newPath);
-
-
for (int i = 0; i < lines.Length; i++)
-
{//6
-
lines[i] = newobject.cleanText(lines[i]); // sends data to get cleaned
-
-
-
//takes the input from the new folder text box
-
// and assigns it to the filename variable
-
string fileName = lines[i] + ".txt";
-
-
// creates new file based off of file name input annd
-
// parent directory
-
string newFile = System.IO.Path.Combine(newPath, fileName);
-
System.IO.File.Create(@newFile);
-
}//6
-
}//5
-
-
else if (cleancheckbox.Checked == false)
-
{
-
-
// Return an error for file with illegal characters
-
-
bool linesOK = true;
-
for (int i = 0; i < lines.Length; i++)
-
{
-
if (lines[i].IndexOfAny(illegal) != -1)
-
{
-
newobject.illegalError();
-
linesOK = false;
-
break;
-
}
-
}
-
-
if (linesOK == true)
-
{
-
newobject.creationInProgress();
-
-
for (int i = 0; i < lines.Length; i++)
-
{
-
// stores the string entered for the new folder name
-
newobject.ParentFolder = newfldrbx.Text;
-
-
// Specify a folder to house everything new inside
-
//This is not the folder that holds the created files/folders
-
// based off of csv/txt values
-
string outputdir = folderBrowserDialog1.SelectedPath;
-
-
//Create a new subfolder under the current active folder
-
// this new folder will hold all files/folders created
-
// per project.
-
string newPath = System.IO.Path.Combine(outputdir, newobject.ParentFolder);
-
-
// Create the subfolder
-
System.IO.Directory.CreateDirectory(newPath);
-
-
//takes the input from the new folder text box
-
// and assigns it to the filename variable
-
string fileName = lines[i] + ".txt";
-
-
// creates new file based off of file name input annd
-
// parent directory
-
string newFile = System.IO.Path.Combine(newPath, fileName);
-
System.IO.File.Create(@newFile);
-
}
-
}
-
}
-
}
-
}
-
-
-
else if (folderbtn.Checked == true)
-
{
-
if (cleancheckbox.Checked == true)
-
{
-
-
-
// Get the value to be passed
-
string parentfolder = newfldrbx.Text;
-
-
//create the child form
-
newobject.ParentFolder = parentfolder;
-
-
// Specify a "currently active folder"
-
string outputdir = folderBrowserDialog1.SelectedPath;
-
-
//Create a new subfolder under the current active folder
-
string newParent = System.IO.Path.Combine(outputdir, newobject.ParentFolder);
-
-
// Create the subfolder
-
System.IO.Directory.CreateDirectory(newParent);
-
-
-
for (int i = 0; i < lines.Length; i++)
-
{
-
lines[i] = newobject.cleanText(lines[i]);
-
-
//Create a new subfolder under the current active folder
-
string newChild = System.IO.Path.Combine(newParent, lines[i]);
-
-
// Create the subfolder
-
System.IO.Directory.CreateDirectory(newChild);
-
}
-
-
newobject.creationInProgress();
-
}
-
-
else if (cleancheckbox.Checked == false)
-
{
-
-
-
// Return an error for file with illegal characters
-
bool linesOK = true;
-
for (int i = 0; i < lines.Length; i++)
-
{
-
if (lines[i].IndexOfAny(illegal) != -1)
-
{
-
newobject.illegalError();
-
linesOK = false;
-
break;
-
}
-
}
-
-
// if the file chosen has no illegal characers this this set of
-
// commmands occurs
-
if (linesOK == true)
-
{
-
-
// Get the value to be passed
-
string parentfolder = newfldrbx.Text;
-
-
//create the child form
-
newobject.ParentFolder = parentfolder;
-
-
// Specify a "currently active folder"
-
string outputdir = folderBrowserDialog1.SelectedPath;
-
-
//Create a new subfolder under the current active folder
-
string newParent = System.IO.Path.Combine(outputdir, newobject.ParentFolder);
-
-
// Create the subfolder
-
System.IO.Directory.CreateDirectory(newParent);
-
-
for (int k = 0; k < lines.Length; k++)
-
{
-
//Create a new subfolder under the current active folder
-
string newChild = System.IO.Path.Combine(newParent, lines[k]);
-
-
// Create the subfolder
-
System.IO.Directory.CreateDirectory(newChild);
-
-
}
-
// this lets the user know the folders were made
-
// and must lie outside of the loops to only iterate
-
// one time
-
newobject.creationInProgress();
-
-
}
-
}
-
}
-
}
-
and here is the replace statement: -
public string cleanText(string c)
-
{
-
string cleanText = c.Replace("/", "-");
-
string cleanText2 = cleanText.Replace("\\", "-");
-
string cleanText3 = cleanText2.Replace(":", "-");
-
string cleanText4 = cleanText3.Replace("?", "-");
-
string cleanText5 = cleanText4.Replace("*", "-");
-
string cleanText6 = cleanText5.Replace("|", "-");
-
string cleanText7 = cleanText6.Replace("\"", "");
-
-
-
return cleanText7;
-
}
-
Thanks for everyones help on this.
15 3577
What is the value of the string newFile?
The user types in a text box a name of a folder (this folder is not one that exists but rather one that will be made)
The name typed in is stored as value "newobject.ParentFolder"
Next the user will browse to an already existing folder from which to work from (i.e. My Documents)
The directory name of the folder they browsed to is stored as "outputdir"
The next step is that the program combines the outputdir (directory name of browsed to folder) with the to-be-created folder "parentfolder"
This combination of "outputdir" and "parentfolder" is then stored as "newPath"
The program then builds the users new folder (the folder for the given project) in this line of code: -
System.IO.Directory.CreateDirectory(newPath);
-
Next there is a for loop that will continue for every item within the given array (the array's length is determined earlier in the code when the file selected is read in line by line)
Then I have each object in the array add the extension ".txt" here: -
string fileName = lines[i] + ".txt";
-
as you can see the new "object[i].txt"
is stored as "fileName" (fileName is reassigned with each iteration of the for loop to accommodate the next object of the array.
This shouldn't be an issue as the file is being created before restarting the beginning of the for loop and reassigning the value "fileName")
Finally there is the newFile value you asked about.
"newFile" is stored as a combination of "newPath" (i.e. combination of "outputdir" and "parentfolder") and "fileName" (i.e. object[i].txt)
So for each "newFile" it should be creating either a file or a folder (based off a selection within the program)
the file/folder will be named based off the name of the currently read object of the array, and created inside the folder name
the user types in to create (a folder not in existence) and that folder will be created within a selected directory (i.e. My Documents)
That was a very long answer to your question but I think it was necessary since newFile is based off a lot of other combinations.
Thanks for your help.
That still doesn't answer my question. I understand your logic in building the string newFile based off user-input and other variables. That is all fine and dandy but I want to know the value of the string before the error occurs. I am assuming the error is occurring on one of the following lines: - System.IO.File.Create(@newFile);
If this is the case I want to know the value of newFile when the error occurred. This will help hint as to what is going on.
Ah. I totally misunderstood. The file being loaded appears as such: -
first line is safe
-
2nd line has ** illegal char
-
third line is safe
-
** oh no
-
hello // goodbye
-
"try this"
-
\and this?
-
The weird thing is any line by itself is running fine for example:
"This sentence needs fixed***"
the program will either fail my test in place and give an error (one of mine) or if the user chooses to replace illegal characters it will create the file/folder named:
"This sentence needs fixed---"
Hope that was the appropriate answer to your question.
Okay you are missing what I mean. -
-
private void Runbtn_Click(object sender, EventArgs e)
-
-
{//1
-
string[] lines = null; //create lines array
-
-
using (StreamReader sr = new StreamReader(@newobject.csvDirectory))
-
{//2
-
string fileContents = sr.ReadToEnd();
-
lines = fileContents.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
-
}//2
-
-
bool safeLength = true;
-
-
if (Filebtn.Checked == true)
-
{//3
-
-
for (int i = 0; i < lines.Length; i++)
-
{//4
-
if (lines[i].Length > MAXFILENAME)
-
{//5
-
newobject.fileNameError();
-
safeLength = false;
-
break;
-
}//5
-
-
}//4
-
-
if (safeLength == true)
-
{//4
-
-
if (cleancheckbox.Checked == true)
-
{ //5
-
newobject.creationInProgress(); // prompts that files are being made
-
-
//create the child form
-
newobject.ParentFolder = newfldrbx.Text;
-
-
// Specify a folder to house everything new inside
-
//This is not the folder that holds the created files/folders
-
// based off of csv/txt values
-
string outputdir = folderBrowserDialog1.SelectedPath;
-
-
//Create a new subfolder under the current active folder
-
// this new folder will hold all files/folders created
-
// per project.
-
string newPath = System.IO.Path.Combine(outputdir, newobject.ParentFolder);
-
-
// Create the subfolder
-
//System.IO.Directory.CreateDirectory(newPath);
-
MessageBox.Show(newPath);
-
-
for (int i = 0; i < lines.Length; i++)
-
{//6
-
lines[i] = newobject.cleanText(lines[i]); // sends data to get cleaned
-
-
-
//takes the input from the new folder text box
-
// and assigns it to the filename variable
-
string fileName = lines[i] + ".txt";
-
-
// creates new file based off of file name input annd
-
// parent directory
-
string newFile = System.IO.Path.Combine(newPath, fileName);
-
//System.IO.File.Create(@newFile);
-
MessageBox.Show(newFile);
-
}//6
-
}//5
-
-
else if (cleancheckbox.Checked == false)
-
{
-
-
// Return an error for file with illegal characters
-
-
bool linesOK = true;
-
for (int i = 0; i < lines.Length; i++)
-
{
-
if (lines[i].IndexOfAny(illegal) != -1)
-
{
-
newobject.illegalError();
-
linesOK = false;
-
break;
-
}
-
}
-
-
if (linesOK == true)
-
{
-
newobject.creationInProgress();
-
-
for (int i = 0; i < lines.Length; i++)
-
{
-
// stores the string entered for the new folder name
-
newobject.ParentFolder = newfldrbx.Text;
-
-
// Specify a folder to house everything new inside
-
//This is not the folder that holds the created files/folders
-
// based off of csv/txt values
-
string outputdir = folderBrowserDialog1.SelectedPath;
-
-
//Create a new subfolder under the current active folder
-
// this new folder will hold all files/folders created
-
// per project.
-
string newPath = System.IO.Path.Combine(outputdir, newobject.ParentFolder);
-
-
// Create the subfolder
-
//System.IO.Directory.CreateDirectory(newPath);
-
MessageBox.Show(newPath);
-
-
//takes the input from the new folder text box
-
// and assigns it to the filename variable
-
string fileName = lines[i] + ".txt";
-
-
// creates new file based off of file name input annd
-
// parent directory
-
string newFile = System.IO.Path.Combine(newPath, fileName);
-
//System.IO.File.Create(@newFile);
-
MessageBox.Show(newFile);
-
}
-
}
-
}
-
}
-
}
-
-
-
else if (folderbtn.Checked == true)
-
{
-
if (cleancheckbox.Checked == true)
-
{
-
-
-
// Get the value to be passed
-
string parentfolder = newfldrbx.Text;
-
-
//create the child form
-
newobject.ParentFolder = parentfolder;
-
-
// Specify a "currently active folder"
-
string outputdir = folderBrowserDialog1.SelectedPath;
-
-
//Create a new subfolder under the current active folder
-
string newParent = System.IO.Path.Combine(outputdir, newobject.ParentFolder);
-
-
// Create the subfolder
-
//System.IO.Directory.CreateDirectory(newParent);
-
MessageBox.Show(newParent);
-
-
-
for (int i = 0; i < lines.Length; i++)
-
{
-
lines[i] = newobject.cleanText(lines[i]);
-
-
//Create a new subfolder under the current active folder
-
string newChild = System.IO.Path.Combine(newParent, lines[i]);
-
-
// Create the subfolder
-
//System.IO.Directory.CreateDirectory(newChild);
-
MessageBox.Show(newChild);
-
}
-
-
newobject.creationInProgress();
-
}
-
-
else if (cleancheckbox.Checked == false)
-
{
-
-
-
// Return an error for file with illegal characters
-
bool linesOK = true;
-
for (int i = 0; i < lines.Length; i++)
-
{
-
if (lines[i].IndexOfAny(illegal) != -1)
-
{
-
newobject.illegalError();
-
linesOK = false;
-
break;
-
}
-
}
-
-
// if the file chosen has no illegal characers this this set of
-
// commmands occurs
-
if (linesOK == true)
-
{
-
-
// Get the value to be passed
-
string parentfolder = newfldrbx.Text;
-
-
//create the child form
-
newobject.ParentFolder = parentfolder;
-
-
// Specify a "currently active folder"
-
string outputdir = folderBrowserDialog1.SelectedPath;
-
-
//Create a new subfolder under the current active folder
-
string newParent = System.IO.Path.Combine(outputdir, newobject.ParentFolder);
-
-
// Create the subfolder
-
//System.IO.Directory.CreateDirectory(newParent);
-
MessageBox.Show(newParent);
-
-
for (int k = 0; k < lines.Length; k++)
-
{
-
//Create a new subfolder under the current active folder
-
string newChild = System.IO.Path.Combine(newParent, lines[k]);
-
-
// Create the subfolder
-
//System.IO.Directory.CreateDirectory(newChild);
-
MessageBox.Show(newChild);
-
-
}
-
// this lets the user know the folders were made
-
// and must lie outside of the loops to only iterate
-
// one time
-
newobject.creationInProgress();
-
-
}
-
}
-
}
-
}
-
-
Copy your current code and paste it into a text file and save it for a backup.
Now copy this code paste it in and run your program. Enter some values for the folder names and tell me what the messageboxes say.
What I am trying to get you to see is that your variable newFile and/or newPath may not contain the data that you think they do...
I don't have access to VS at the moment but I am fairly certain that the file dialog selected path returns the path with a \ at the end. Use that with the Path.Combine method and you now have a \\ in your string. The @ symbol on newFile says to take it literally and this will give you your illegal character error.
I'm getting the same error as before: Illegal character
Here's the details:
See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.
************** Exception Text **************
System.ArgumentException: Illegal characters in path.
at System.IO.Path.CheckInvalidPathChars(String path)
at System.IO.Path.Combine(String path1, String path2)
at WindowsFormsApplication1.Form1.Runbtn_Click(Object sender, EventArgs e) in C:\Users\Dahlia\Desktop\CSV program\Form1.cs:line 137
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventAr gs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.O nMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.W ndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** Loaded Assemblies **************
mscorlib
Assembly Version: 4.0.0.0
Win32 Version: 4.0.30319.1 (RTMRel.030319-0100)
CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
WindowsFormsApplication1
Assembly Version: 1.0.0.0
Win32 Version: 1.0.0.0
CodeBase: file:///C:/Users/Dahlia/Desktop/CSV%20program/WindowsFormsApplication1/WindowsFormsApplication1/bin/Release/WindowsFormsApplication1.exe
----------------------------------------
System.Windows.Forms
Assembly Version: 4.0.0.0
Win32 Version: 4.0.30319.1 built by: RTMRel
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
Assembly Version: 4.0.0.0
Win32 Version: 4.0.30319.1 built by: RTMRel
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System
Assembly Version: 4.0.0.0
Win32 Version: 4.0.30319.1 built by: RTMRel
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Xml
Assembly Version: 4.0.0.0
Win32 Version: 4.0.30319.1 built by: RTMRel
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.
For example:
<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>
When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.
Your string variable outputdir ends with a \, when you try to use it in the Path.Combine method it throws the illegal character error.
If the outputdir ends with a \ wouldn't it always give me an illegal character error then? I can get the program to run if it is loading a file with only a single line of text.
My code populates a corresponding text box with the directory stored as "outputdir" and it does not end with a "\" so I think the problem lies elsewhere.
@Fuzz13
Do that with your other variables and you should be able to pin point the error.
I am pretty sure I have found the line of code that is giving me the error. -
string fileName = lines[i] + ".txt";
-
-
string newFile = System.IO.Path.Combine(newPath, fileName);
-
The presence of "lines[i]" is the issue. If I instead use a string literal like this: -
string fileName = "something nice" + ".txt";
-
-
string newFile = System.IO.Path.Combine(newPath, fileName);
-
It will work just fine. The debugger says the error is in the second line of code where the two are combined but it's dependent on that "lines[i]" bit. It also crashes if I use "lines[0]" or any given value. That narrows it down but I don't know what to do about it. Any suggestions?
Check the value of lines[i] and verify that there are no illegal characters in it.
I have. There are none. The value of lines[i] appears as:
"This is text"
"This is more text"
"Again more text"
(the quotes are not part of the actual text)
Ok I got it to run using the lines[i] code if there is only 1 line of data in the file loading. Multiple lines of data returns an Error. I am wondering if the trouble its having is coming from how the lines of data are being read into the array: -
string[] lines = null; //create lines array
-
-
using (StreamReader sr = new StreamReader(@newobject.csvDirectory))
-
{
-
string fileContents = sr.ReadToEnd();
-
lines = fileContents.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
-
}
-
This at one point had worked properly but something changed in my code and it no longer does so I'm not sure what it is. The code posted should read each line of the file into an array as an object. (line 1 of file = object 0).
Thoughts?
Sign in to post your reply or Sign up for a free account.
Similar topics
by: Sean Bartholomew |
last post by:
i have a bit of a problem.
im parsing a record string using strtok but im encountering back to
back whitespaces (\t\t) due to empty fields from my database export.
the STRTOK function reads up to...
|
by: drj0nson |
last post by:
What is the right way of creating a string/char array and assigning to
a char* which is then used in a function call. Thought it would be
quite nice to avoid a memory leakage /core dump.
1...
|
by: Alvin Bruney |
last post by:
Anybody know how to fix this. Currently only a reboot will cure it. I'm sick
and fed up of rebooting. It has to be one of these services running in the
background doing this. It can happen with any...
|
by: mast2as |
last post by:
Hi everyone... I have a TExceptionHandler class that is uses in the
code to thow exceptions. Whenever an exception is thrown the
TExceptionHander constructor takes an error code (int) as an...
|
by: dasilva109 |
last post by:
Hi guys
I am new to C++ and need urgent help with this part of my code for a
uni coursework I have to submit by Thursday
//ClientData.h
#ifndef CLIENTDATA_H
#define CLIENTDATA_H
#include...
|
by: devmentee |
last post by:
Hi All,
I am compiling a VS2003 mixed mode C++ DLL under VS2005 and I get the
following linker error. I am using STL map inside a C++ class which is
compiled as a mixed mode DLL.
I have...
|
by: one2001boy |
last post by:
PostMessage() function returns ERROR_NOT_ENOUGH_QUOTA after running in a
loop for 700 times, but the disk space and memory are still big enough.
any suggestion to resolve this problem?
thanks.
|
by: Tarik Monem |
last post by:
Hi Everyone,
Still a newbie with FLEX, and I've passed arrays using AJAX to FLEX before, but I've never passed links to FLEX.
Basically, this is the OUTPUT, which I wanted, but I'm given an...
|
by: Dennis Jones |
last post by:
Hi all,
1) Let's say you have two char 's of the same size. How would you write a
no-fail swap method for them? For example:
class Test
{
char s;
void swap( Test &rhs )
{
|
by: Hongyu |
last post by:
Hi,
I have a datetime char string returned from ctime_r, and it is in the
format like ""Wed Jun 30 21:49:08 1993\n\0", which has 26 chars
including the last terminate char '\0', and i would...
|
by: Charles Arthur |
last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
|
by: emmanuelkatto |
last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud.
Please let me know.
Thanks!
Emmanuel
|
by: BarryA |
last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
|
by: nemocccc |
last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
|
by: Hystou |
last post by:
There are some requirements for setting up RAID:
1. The motherboard and BIOS support RAID configuration.
2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new...
| |